【问题标题】:What happens to the data that is passed to and from a background worker?传入和传出后台工作人员的数据会发生什么情况?
【发布时间】:2011-07-06 22:04:10
【问题描述】:

传入和传出后台工作人员的数据会发生什么情况?

使用 RunWorkerAsync 将数据从主线程传递到后台工作线程:

backgroundWorker.RunWorkerAsync(myData);

这是在后台线程的 DoWork 事件处理程序中接收到的:

myData = (Data)e.Argument;

DoWork处理完数据后,使用e.Result返回:

e.Result = myData;

这是在主线程的 RunWorkerCompleted 事件处理程序中接收到的:

myData = (Data)e.Result;

BackgroundWorker 负责在线程之间传递数据。我期望将大量数据传入和传出后台工作者,所以我想知道这种传输的开销是多少,以及是否有更好的方法来处理后台工作者中的大量内存对象。我还想知道是否可以从主线程以线程安全的方式访问后台工作人员中的数据。

作为参考,我使用的是 C#、.Net 3.5 和 Windows 窗体。

【问题讨论】:

    标签: c# .net winforms backgroundworker


    【解决方案1】:

    确实没有开销(假设Data 是一个类),因为只有引用被传递。数据本身不会“复制”到线程中 - 所有线程都可以访问进程中的数据(大部分情况下)。

    我也想知道是否可以从主线程以线程安全的方式访问后台工作人员中的数据。

    是的,可以访问数据,但为了以线程安全的方式进行,您需要自己管理同步。这通常需要 lock 之类的东西,但根据您要完成的工作,有很多选项。

    【讨论】:

    • +1 用于回答问题的多线程同步部分。
    【解决方案2】:

    对象总是通过引用传递。没有任何开销。

    BackgroundWorker 只是将对象添加到内部队列,然后在 UI 线程上从队列中读取它。 (这个其实是Control.MarshaledInvoke做的)

    【讨论】:

    • @Reed:他说Objects,这意味着值类型的装箱。但答案的措辞是模棱两可的。
    【解决方案3】:

    传输中基本上没有开销;它只是一个对象引用(没有对所涉及的数据进行任何形式的编组)。只要主线程不访问调用 RunWorkerAsync 和 RunWorkerCompleted 之间的数据,您就是线程安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2011-06-15
      • 1970-01-01
      • 2023-03-30
      • 2017-07-18
      • 2011-02-13
      • 1970-01-01
      相关资源
      最近更新 更多