gpt4 book ai didi

c# - ILArrays 作为 BeginInvoke 委托(delegate)的输入参数

转载 作者:行者123 更新时间:2023-11-30 21:58:10 25 4
gpt4 key购买 nike

在我的应用程序中,我有一个执行计算并将生成的 ILnumerics 数组推送到 View 的后台线程。当我使用 Control.BeginInvoke 触发 View 更新功能时,我遇到了 ILNumerics 数组被处理掉的问题。

将 ILArrays 作为输入参数传递给 BeginInvoke 委托(delegate)时,是否有任何特定的函数规则要遵循?

这是我的示例代码。

void IMainView.UpdateSpectrumData(ILInArray<float> wfmData)
{
if (InvokeRequired)
{
BeginInvoke(new MethodInvoker(() => AddWfmToView(wfmData)), new object[] { wfmData });
}
else
{
AddWfmToView(wfmData);
}
}
}

void AddWfmToView(ILInArray<float> wfmData)
{
using(ILScope.Enter(wfmData))
{
// update panel
}
}

最佳答案

问题是编译器会在幕后为你创建一个匿名类。需要捕获 lambda 表达式中使用的变量。对于那个类,编译器不会遵循 ILNumerics 函数规则。这就是为什么您会看到过早处置的原因。

您的问题的答案是:lambda 表达式不支持 ILArray。仅当您了解与它相关的所有微妙之处时才可小心使用它。

在你的情况下,你可以通过回退到 ILNumerics.ILArray class usage 来解决这个问题。 .在您的容器类(表单/控件?)中声明一个属性,该属性保存要用于更新的数据。从您的更新例程中,您可以正常访问该属性。对于大多数常见情况,您不需要任何同步。 (但一如既往:仔细考虑并做出有意识的决定!)

// a local attribute will 'transport' the data
ILArray<float> m_data = ILMath.localMember<float>();

public void UpdateView(ILInArray<float> wfmData) {
using (ILScope.Enter(wfmData)) {
m_data.a = wfmData;
AddWfmToView();
}
}
// the actual update method will not expose ILArray parameters. Hence we can use it in a lambda expression.
void AddWfmToView() {
if (InvokeRequired) {
Invoke(new MethodInvoker(() => AddWfmToView()));
} else {
// access control here if necessary
panel.Scene.First<ILLinePlot>().Update(m_data);
panel.Configure();
panel.Refresh();
}

}

关于c# - ILArrays 作为 BeginInvoke 委托(delegate)的输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30258484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com