在BackgroundWorker中访问类级变量时,需要使用线程安全的方法。以下是一个示例解决方法:
public class MyClass
{
private static int counter = 0; // 类级变量
private static readonly object lockObject = new object(); // 用于同步访问变量的锁对象
private static void DoWork(object sender, DoWorkEventArgs e)
{
// 在后台线程中访问类级变量
lock (lockObject) // 加锁以确保线程安全
{
counter++;
}
}
private static void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// 在后台线程完成后访问类级变量
lock (lockObject) // 加锁以确保线程安全
{
Console.WriteLine("Counter value: " + counter);
}
}
public static void Main(string[] args)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += DoWork;
worker.RunWorkerCompleted += WorkerCompleted;
worker.RunWorkerAsync();
// 等待一段时间,以确保后台线程完成
Thread.Sleep(1000);
}
}
在上面的示例中,我们使用了一个静态的锁对象lockObject来同步访问类级变量counter。在DoWork方法和WorkerCompleted方法中,我们使用lock语句来确保只有一个线程可以访问counter的值。
当DoWork方法被后台线程调用时,它会加锁并增加counter的值。当后台线程完成时,WorkerCompleted方法会被调用,它也会加锁并输出counter的值。
这样,我们可以确保在多线程环境下对类级变量的访问是线程安全的。