在构造期间,将其传递给RunWorkerAsync

时间:2014-11-29 18:41:34

标签: c# constructor backgroundworker

我有这段代码

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是最后一条指令,那么构造函数是线程安全的

1 个答案:

答案 0 :(得分:2)

传递对象引用本身是安全的。但实际上,当DoWhatever启动时,构造函数可能无法完成。没有机制可以神奇地等待构造函数完成,直到其他一些不相关的方法可以启动。 BackgroundWorker与调用它的代码无关。即使它想要它也找不到。