ILArrays作为BeginInvoke委托的输入参数

本文关键字:输入 参数 作为 BeginInvoke ILArrays | 更新日期: 2023-09-27 17:49:25

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

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

这是我的示例代码。

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
              }
         }

ILArrays作为BeginInvoke委托的输入参数

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

你的问题的答案是:在lambda表达式中不支持ILArray。如果你意识到与之相关的所有微妙之处,请谨慎使用它。

在您的情况下,您可以通过返回ILNumerics来解决问题。ILArray类的用法。在容器类(form/control?)中声明一个属性,用于保存要用于更新的数据。从您的更新例程中,您可以正常访问该属性。对于大多数常见场景,您不需要任何同步。(但一如既往:考虑一下,做出一个有意识的决定!)

// 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(); 
    }
}