在派生自BackgroundWorker的类中是否需要锁定语句?

时间:2017-11-29 21:07:09

标签: c# multithreading backgroundworker

我有一个继承自BackgroundWorker的类,可以在远程服务器上执行某些特定的操作。我已经为这个类添加了属性来存储作业完成所需的信息。例如:

 public class GenerateFileWorker : System.ComponentModel.BackgroundWorker
{
    public string LocalFileName { get; set; }
    public string Username { get; set; }
    public string Password { get; set;  }

    public GenerateFileWorker() {}

    public GenerateFileWorker(string username, string password, string localFileName)
    {
        Username = username;
        Password = password;
        LocalFileName = localFileName;
    }
    protected override void OnDoWork(DoWorkEventArgs e) {
    // ... 
}

我知道需要lock才能安全地访问课堂外的对象,但内部呢?访问OnDoWork()中的当前实例的属性时是否需要它?

1 个答案:

答案 0 :(得分:1)

这不是你继承哪个班级的问题。这是一个问题,即多个线程是否可以同时读取或修改属性或字段,以便它们相互干扰,或者一个线程读取而另一个线程正在更新某些内容。那时您需要lock(或其他一些机制)来确保不会发生此类冲突。 (为简洁起见,这是过于简单化。)

来自documentation

  

BackgroundWorker类允许您在单独的专用线程上运行操作。

这个想法是UI线程只与后台线程交互,方法是取消它,从中获取进度报告,或者通知它已经完成或失败。它不直接访问进程中使用的变量(状态)。

你班上有一点突出的是:

public string LocalFileName { get; set; }
public string Username { get; set; }
public string Password { get; set;  }

因为这些是读/写属性,所以UI线程可能会在后台线程使用它们时更新它们。我想这可能不是你的意图。这些属性是否需要可写?或者他们甚至需要成为房产? (如果它们不需要是属性,你需要继承吗?)

也许您可以在后台进程的开头初始化包含这些值的变量。现在这些变量在后台进程执行的方法中是私有的,这意味着UI线程或任何其他线程不可能与它们进行交互。