.net - 在控制台应用程序中使用 .NET BackgroundWorker 类

标签 .net multithreading backgroundworker

我一般对 .NET 编程和多线程比较陌生,想知道是否可以使用 .NET 提供的 BackgroundWorker 来生成工作线程以在控制台应用程序中做一些工作?从在线的各种文档中,我看到这个类的意图更多的是面向 UI 的应用程序,你想在后台做一些工作,但保持 UI 响应,报告进度,如果需要取消处理等。

就我而言,基本上我有一个 Controller 类,我想在其中生成多个工作线程来进行一些处理(限制使用信号量生成的工作线程的最大数量)。然后我希望我的 Controller 类阻塞,直到所有线程都完成处理。所以在我启动一个工作线程做一些工作后,我希望线程能够在处理完成时通知 Controller 线程。我看到我可以使用后台工作程序类,并处理事件 DoWork 和 RunWorkerCompleted 来完成此操作,但是想知道这是否是个好主意?有没有更好的方法来实现这一目标?

最佳答案

这在控制台应用程序中不起作用,因为 SynchronizationContext.Current永远不会被初始化。当您使用 GUI 应用程序时,这是由 Windows 窗体或 WPF 为您初始化的。

话虽如此,没有理由这样做。只需使用 ThreadPool.QueueUserWorkItem ,和一个重置事件( ManualResetEventAutoResetEvent )来捕获完成状态,并阻塞你的主线程。

编辑:

在看到一些 OP 评论后,我想我会添加这个。

在我看来,“最好”的选择是获取 Rx Framework 的副本。 ,因为它包含 .NET 4 中 TPL 的反向移植。这将允许您使用 Parallel.ForEach 的重载它提供了提供 ParallelOptions 的选项实例。这将允许您限制并发操作的总数,并为您处理所有工作:

// using collection of work items, such as: List<Action<object>> workItems;
var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 10; // Restrict to 10 threads, not recommended!

// Perform all actions in the list, in parallel
Parallel.ForEach(workItems, options, item => { item(null); });

但是,使用 Parallel.ForEach,我个人会让系统管理并行度。它将自动分配适当数量的线程(尤其是当/如果这转移到 .NET 4)。

关于.net - 在控制台应用程序中使用 .NET BackgroundWorker 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2196204/

相关文章:

c# - 需要在 ASP.NET 网络表单中包装表行和控件

c# - 并发收集以最快的速度添加、删除和查找最高的

c# - 使用 HTTPCLient 下载文件时减少内存占用

java - 在输入流中等待时执行某些操作

在 C 中使用 pThread 将数组与多线程进行比较

c# - 在没有 WinForm 控件的情况下在主线程上调用一个方法来调用 Invoke 或 BeginInvoke

c# - DateTime 函数之间有什么区别?

C# - 异步/等待打印顺序

c# - 如何使后台线程暂停然后继续单击按钮?

c# - 使用适当的值更新 ProgressBar