我有这段代码
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
是最后一条指令,那么构造函数是线程安全的
答案 0 :(得分:2)
传递对象引用本身是安全的。但实际上,当DoWhatever
启动时,构造函数可能无法完成。没有机制可以神奇地等待构造函数完成,直到其他一些不相关的方法可以启动。 BackgroundWorker
与调用它的代码无关。即使它想要它也找不到。