我必须从用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);
答案 0 :(得分:0)
通过" local"是安全的。变量,但记住他们不再是"本地"一旦你通过他们。现在已将引用传递给另一个可能在单独的线程上并发运行的操作。现在,多个线程可以访问" local"变量因此可能需要锁定或其他线程安全处理。
您不必担心它是GC,因为仍有一个参考传递给BeginInvoke
。