我有这个代码
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
与调用它的任何代码都没有关系。即使它愿意也无法找到。
关于c# - 在构建过程中,将此传递给RunWorkerAsync,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27205643/