任何人都可以解释委托和BackgroundWorker之间的区别吗?在哪种情况下,Backgroundworker比Delegate更有效?因为我们有异步委托,所以需要使用BackGroungWorker。
答案 0 :(得分:9)
BackgroundWorker类允许您在单独的专用线程上运行操作。
委托是定义方法签名的类型。 ...委托用于将方法作为参数传递给其他方法。
使用哪一个与效率无关的问题。
BackgroundWorker
是一个简化了线程处理的包装器,您也可以使用异步委托,但正确管理它们要困难得多。或者,来自MSDN:
当您需要响应式用户界面并且您遇到与此类操作相关的长时间延迟时,BackgroundWorker类提供了一种方便的解决方案。
答案 1 :(得分:4)
我对BackgroundWorker
,异步委托和其他方法on my blog进行了简要比较(从后台操作的角度来看)。
BackgroundWorker
具有以下优势:
BackgroundWorker
属性为true的任何WorkerSupportsProgress
都可以报告进度。 DoWork
委托可以调用ReportProgress
,这会导致ProgressChanged
事件触发。BackgroundWorker.CancelAsync
。这会导致BackgroundWorker.CancellationPending
属性变为true。 DoWork
委托应该监视该属性(定期检查它),并将DoWorkEventArgs.Cancel
设置为true,如果操作被取消则返回。 RunWorkerCompleted
委托通过选中RunWorkerCompletedEventArgs.Cancelled
ProgressChanged
和RunWorkerCompleted
个事件会与SynchronizationContext
被调用时的RunWorkerAsync
同步。异步代理具有以下优势:
总之,我建议使用Task<TResult>
代替BackgroundWorker
或异步代理。
答案 2 :(得分:2)
后台工作程序主要用于UI工作,您需要在后台线程上轻松运行任务并向屏幕提供进度更新。
一个优点是它为你调整了它对UI线程的回调,所以你不需要检查InvokeRequired等。
委托是一种更通用的机制,用于将函数作为参数传递,并且通过异步执行它们,它们为您提供了在另一个线程上运行这些方法的简便方法。
答案 3 :(得分:1)
后台工作程序是一个抽象,可以帮助您在单独的线程上执行操作。
代理并不真正启动单独的线程 - 它们是用于引用方法的类型。
但您可能感兴趣的是何时应该使用异步方法而不是使用后台工作程序。我对此没有多少经验,但Anders Hejlsberg talked about it some in his PDC session on the Future of C#。
我得到的信息是,在某些情况下,异步方法会更好,因为复杂性较低。 UI线程仍然会被阻止,但不会太长,以至于它很重要。