在 UI 表单和后台线程之间共享变量的安全方法
Safe way to share variables between UI form and background thread
在我的项目中,我有一个 windows 表单应用程序,我想在其中使用后台线程中的一些变量向用户显示后台工作的状态。根据它们的价值,我会显示一些信息或其他信息。如何安全地面对线程间共享变量的问题?
谢谢。
.Net 已经带有一个 System.ComponentModel.BackgroundWorker class 专门用于处理执行后台任务和与 GUI 通信。使用它。
更新
如果你想要另一种方法,这就是我所做的。
1) 创建你 "message" classes。这存储了您要共享的所有信息。
2) 为每个线程创建一个队列。使用 SyncLock(C# 锁)来 read/write 到它。
3) 当您想与一个线程对话时,通过将消息添加到队列向它发送一个消息对象,其中包含它需要的所有信息的副本。
4) 工作线程然后可以从队列中读取,按顺序读取和处理每条消息。没有消息的时候就睡觉。
确保您没有在两个线程之间共享对象。一旦您的 GUI 线程将消息放入队列中,GUI 线程就不再拥有该消息。它不能保存对消息的引用,否则你会惹上麻烦。
这不会为您提供最佳性能,但对于大多数应用程序来说已经足够了。更重要的是,这将使犯错变得更加困难。
在我的项目中,我有一个 windows 表单应用程序,我想在其中使用后台线程中的一些变量向用户显示后台工作的状态。根据它们的价值,我会显示一些信息或其他信息。如何安全地面对线程间共享变量的问题?
谢谢。
.Net 已经带有一个 System.ComponentModel.BackgroundWorker class 专门用于处理执行后台任务和与 GUI 通信。使用它。
更新
如果你想要另一种方法,这就是我所做的。
1) 创建你 "message" classes。这存储了您要共享的所有信息。
2) 为每个线程创建一个队列。使用 SyncLock(C# 锁)来 read/write 到它。
3) 当您想与一个线程对话时,通过将消息添加到队列向它发送一个消息对象,其中包含它需要的所有信息的副本。
4) 工作线程然后可以从队列中读取,按顺序读取和处理每条消息。没有消息的时候就睡觉。
确保您没有在两个线程之间共享对象。一旦您的 GUI 线程将消息放入队列中,GUI 线程就不再拥有该消息。它不能保存对消息的引用,否则你会惹上麻烦。
这不会为您提供最佳性能,但对于大多数应用程序来说已经足够了。更重要的是,这将使犯错变得更加困难。