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

5 .net c# backgroundworker winforms

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

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

backgroundWorker.RunWorkerAsync(myData);
Run Code Online (Sandbox Code Playgroud)

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

myData = (Data)e.Argument;
Run Code Online (Sandbox Code Playgroud)

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

e.Result = myData;
Run Code Online (Sandbox Code Playgroud)

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

myData = (Data)e.Result;
Run Code Online (Sandbox Code Playgroud)

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

作为参考,我使用的是C#,.Net 3.5和Windows Forms.

Ree*_*sey 6

确实没有开销(提供Data类),因为只传递了引用.数据本身不会"复制"到线程中 - 所有线程都可以访问进程中的数据(大多数情况下).

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

是的,可以访问数据,但为了以线程安全的方式执行,您需要自己管理同步.这通常需要像a这样的东西lock,尽管有很多选项取决于你想要完成的事情.


SLa*_*aks 5

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

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