在对begininvoke的调用中使用局部变量是否不安全



我必须从用C#编写的colleaque中接管一个更大应用程序的源代码。它使用windows形成线程,现在它可以正常工作。但有一件事我不确定,那就是他处理委托中使用的参数的方式,这些委托是从线程引发到应用程序中的windows窗体的。我不知道为什么,但他定义了许多不同的对象数组,其中包含不同数量的元素,例如:

private object[] delegateArray1;
private object[] delegateArray3;
private object[] delegateArray3A;

在代码中,他使用了它,然后是

delegateArray1 = new object[1]; // in the constructor of the thread class 
delegateArray3 = new object[3]; 
delegateArray3a = new object[3];
// and this somewhere in the thread loop
delegateArray3[0] = systemtests.FehlerText;
delegateArray3A[1] = CheckState.Unchecked;
delegateArray3A[2] = testKanal;
sender.BeginInvoke(merkerInfoDelegate, delegateArray3);

其中CCD_ 1是从其创建线程的容器控件。merkerInfoDelegate指出了一种具有签名的方法

public void InfoAnzeige(string scrollText, CheckState state, int kanal);

我的第一个问题是:

我传递给BeginInvoke方法的变量/对象是否可能被垃圾收集,因此在委托方法最终执行时无效。如果是,我该如何防止这种情况发生?

是否不能这样称呼代表:

sender.BeginInvoke(merkerInfoDelegate, systemtests.FehlerText, CheckState.Unchecked, testKanal);

我想让代码更可读、更安全、更可靠。我想声明像MouseEventArgs类这样的类,它们由这些参数组成,并封装所有必要的数据,以便传递给windows窗体类中的委托方法。。。

public InfoDelegateEventArgs
{
public String Fehlertext;
public CheckState state;
public int Kanal;
}

这可以这样使用:

idea = new InfoDelegateEventArgs(){...};
sender.BeginInvoke(merkerInfoDelegate, idea);

传递"局部"变量是安全的,但请记住,一旦传递它们,它们就不再是"局部"的。引用现在已经传递给另一个操作,该操作可能在单独的线程上并发运行。现在,多个线程可以访问"本地"变量,因此可能需要锁定或其他线程安全处理。

您不必担心它会被GC,因为仍然有一个引用被传递给BeginInvoke

最新更新