传递给后台工作者的数据会发生什么变化?

时间:2011-07-06 22:04:10

标签: c# .net winforms backgroundworker

传递给后台工作者的数据会发生什么变化?

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

backgroundWorker.RunWorkerAsync(myData);

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

myData = (Data)e.Argument;

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

e.Result = myData;

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

myData = (Data)e.Result;

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

供参考,我使用的是C#,。Net 3.5和Windows Forms。

3 个答案:

答案 0 :(得分:6)

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

  

我还想知道可以以线程安全的方式从主线程访问后台worker中的数据。

是的,可以访问数据,但为了以线程安全的方式执行,您需要自己管理同步。这通常需要类似lock的内容,但有很多选项取决于您要完成的任务。

答案 1 :(得分:5)

对象始终通过引用传递。没有任何开销。

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

完成的

答案 2 :(得分:1)

转移基本上没有开销;它只是一个对象引用(没有涉及数据的编组)。只要主线程不访问RunWorkerAsync和RunWorkerCompleted调用之间的数据,就是线程安全的。