在构造期间,将其传递给 RunWorkerAsync
本文关键字:RunWorkerAsync | 更新日期: 2023-09-27 18:32:24
我有这个代码
public class MyClass
{
BackgroundWorker worker;
/* ... */
public MyClass()
{
worker = new BackgroundWorker();
worker.DoWork += DoWhatever;
worker.RunWorkerAsync(this);
/* Some other code */
}
internal static void DoWhatever(object sender, DoWorkEventArgs e)
{
MyClass thingy = (MyClass)e.Argument;
/* ... */
}
}
在那里,我将自己的实例发送给辅助角色。这是否会导致任何类型的线程问题,或者DoWhatever
中的代码会等到实例完全实例化?
编辑:正如在接受的答案中所澄清的那样,可能会出现种族条件。这本身不是线程安全的,但如果RunWorkerAsync
是最后一个指令,那么构造函数是线程安全的
传递对象引用本身是安全的。但实际上,构造函数在启动时可能无法完成DoWhatever
。没有任何机制可以神奇地等待构造函数完成,直到其他一些不相关的方法可以启动。 BackgroundWorker
与调用它的任何代码都没有联系。即使它想发现,它也找不到。