【问题标题】:Sharing object between forms and a background thread worker in a windows form app在 Windows 窗体应用程序中的窗体和后台线程工作者之间共享对象
【发布时间】:2014-05-10 01:47:56
【问题描述】:

我有以下情况。

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

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

解决此类问题的最佳方法是什么?

有人问我问题是什么,但我认为我已经涵盖了,但我会尝试添加更多细节。

好的,我有一个可以说这样的对象

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

然后我有 2 个不同的表单同时打开。一种是显示用户,另一种是显示计算机。

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

如何将后台线程正在构建的数据与多个表单共享?

【问题讨论】:

  • 你还没有告诉我们问题出在哪里。
  • 什么是“共享对象”?表单控件? BackgroundWorker.ReportProgress 已经编组到 UI 线程;这是你在做什么?
  • 我试图为问题添加更多细节。不,我没有对 BackgroundWork 做任何事情,我实际上不确定它是做什么的(现在要去看看)

标签: c# multithreading winforms


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    解决此问题的一种简单而干净的方法是使用任务 (System.Threading.Tasks) 而不是 BackgroundWorker。传入在 UI 线程上创建的 SyncronizationContext,框架会为您完成所有锁定工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多