ILArrays 作为 BeginInvoke 委托的输入参数
ILArrays as input arguments to BeginInvoke delegate
在我的应用程序中,我有一个执行计算并将生成的 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
}
}
问题是编译器会在幕后为你创建一个匿名的class。需要捕获 lambda 表达式中使用的变量。对于 class 编译器将不遵循 ILNumerics 函数规则。这就是为什么您会看到过早处置的原因。
您问题的答案是:lambda 表达式不支持 ILArray。仅当您了解与它相关的所有微妙之处时才可小心使用它。
对于您的情况,您可以通过回退到 ILNumerics.ILArray class usage 来解决该问题。在您的容器 class (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();
}
}
在我的应用程序中,我有一个执行计算并将生成的 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
}
}
问题是编译器会在幕后为你创建一个匿名的class。需要捕获 lambda 表达式中使用的变量。对于 class 编译器将不遵循 ILNumerics 函数规则。这就是为什么您会看到过早处置的原因。
您问题的答案是:lambda 表达式不支持 ILArray。仅当您了解与它相关的所有微妙之处时才可小心使用它。
对于您的情况,您可以通过回退到 ILNumerics.ILArray class usage 来解决该问题。在您的容器 class (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();
}
}