我有一个继承自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()
中的当前实例的属性时是否需要它?
答案 0 :(得分:1)
这不是你继承哪个班级的问题。这是一个问题,即多个线程是否可以同时读取或修改属性或字段,以便它们相互干扰,或者一个线程读取而另一个线程正在更新某些内容。那时您需要lock
(或其他一些机制)来确保不会发生此类冲突。 (为简洁起见,这是过于简单化。)
BackgroundWorker类允许您在单独的专用线程上运行操作。
这个想法是UI线程只与后台线程交互,方法是取消它,从中获取进度报告,或者通知它已经完成或失败。它不直接访问进程中使用的变量(状态)。
你班上有一点突出的是:
public string LocalFileName { get; set; }
public string Username { get; set; }
public string Password { get; set; }
因为这些是读/写属性,所以UI线程可能会在后台线程使用它们时更新它们。我想这可能不是你的意图。这些属性是否需要可写?或者他们甚至需要成为房产? (如果它们不需要是属性,你需要继承吗?)
也许您可以在后台进程的开头初始化包含这些值的变量。现在这些变量在后台进程执行的方法中是私有的,这意味着UI线程或任何其他线程不可能与它们进行交互。