在窗体和windows窗体应用程序的后台线程工作者之间共享对象



我有以下情况

显示存储在共享对象中的信息的多个表单。不断更新共享对象的后台工作线程。

我想让共享对象类似于单例,但我担心多线程问题。

解决这类问题的最好方法是什么?

我被问到问题是什么,但我认为我已经涵盖了,但我会尽量补充更多的细节。

我有一个比方说像这样的对象

public class Connections
{
public List<User> Users {get;set;}
public List<Computer> Computers {get;set;}
}

然后我有两个不同的表单同时打开。一个表单用于显示Users,另一个用于显示Computers。

接下来我有一个后台线程填充用户和计算机。

我如何共享数据,后台线程正在建设与多个窗体?

任何后台线程和UI线程之间共享的数据都需要锁来保护。也就是说,您需要选择一个对象进行同步(可能是正在共享的"主对象",如果有的话),并且无论何时修改或读取该对象的成员变量,您都需要首先锁定它。

或者,您可以在任何需要更新数据的时候从后台线程使用Control.Invoke(),这样只有UI线程会实际修改共享对象,使其不再在线程之间共享。

解决这个问题的一个简单而干净的方法是使用Tasks (System.Threading.Tasks)来代替BackgroundWorker。传入一个在UI线程上创建的SyncronizationContext,框架就会为你完成所有的锁工作。

最新更新