我有这个代码

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/

10-13 08:34