gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:48:53 25 4
gpt4 key购买 nike

我一般对 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com