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

时间:2017-10-16 13:01:25

标签: c# multithreading delegates

我必须从用C#编写的colleaque接管更大应用程序的源代码。它使用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);

其中sender是从中创建线程的容器控件。 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);

1 个答案:

答案 0 :(得分:0)

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

您不必担心它是GC,因为仍有一个参考传递给BeginInvoke