传递给后台工作者的数据会发生什么变化?
使用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。
答案 0 :(得分:6)
确实没有开销(假设Data
是一个类),因为只传递了引用。数据本身不会“复制”到线程中 - 所有线程都可以访问进程中的数据(大多数情况下)。
我还想知道可以以线程安全的方式从主线程访问后台worker中的数据。
是的,可以访问数据,但为了以线程安全的方式执行,您需要自己管理同步。这通常需要类似lock
的内容,但有很多选项取决于您要完成的任务。
答案 1 :(得分:5)
对象始终通过引用传递。没有任何开销。
BackgroundWorker
只是将对象添加到内部队列,然后从UI线程的队列中读取它。 (这实际上是由Control.MarshaledInvoke
)
答案 2 :(得分:1)
转移基本上没有开销;它只是一个对象引用(没有涉及数据的编组)。只要主线程不访问RunWorkerAsync和RunWorkerCompleted调用之间的数据,就是线程安全的。