在构造期间,将其传递给 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是最后一个指令,那么构造函数是线程安全的

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

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