【发布时间】:2012-05-04 00:57:59
【问题描述】:
我遇到了 Mono 的困境。我试图了解BackgroundWorker 实例如何或为什么不能同时运行,或者至少不能非常有效或快速地运行。好像线程的数量受到了某种限制,但我不是 Mono 开发人员或 .NET 开发人员,所以我把自己交给了我的兄弟们的怜悯。
考虑以下示例:
using System;
using System.ComponentModel;
using System.Threading;
namespace backgroundworkertest
{
class MainClass
{
public static void foo(object sender, DoWorkEventArgs e) {
Console.WriteLine("Start");
Thread.Sleep(500);
Console.WriteLine("Done");
}
public static void Main (string[] args)
{
for(int i = 0; i < 6; i++) {
BackgroundWorker b = new BackgroundWorker();
b.WorkerReportsProgress = false;
b.DoWork += new DoWorkEventHandler(foo);
b.RunWorkerAsync();
}
Thread.Sleep(2000);
Console.WriteLine("Really done");
}
}
}
当我运行上述程序时,我得到以下输出。
开始 开始 完毕 开始 开始 完毕 开始 完毕 真的完成了首先,并非所有BackgroundWorkers 都在整整两秒内完成。从循环中,很明显我正在实例化 6 个工作人员,但只有 3 个打印“完成”。如果所有 6 人同时运行,我觉得两秒钟应该足以让这些工作人员完成。
真正的内幕是我有一个运行良好的应用程序(使用大量 BackgroundWorkers 在后台通过 HTTP 获取图像。但是,不同之处在于这个应用程序是在 C# .NET 中实现的. 当我将应用程序移植到 Mono 时,BackgroundWorkers 似乎一次只运行几个,因此 HTTP 连接很容易超时。我想看看是否是这种情况,因此上面的例子和问题...
这里发生了什么?为什么不是所有的BackgroundWorkers 都同时运行?我需要设置一些参数吗?
【问题讨论】:
-
在有人问之前,我知道我应该使用线程池。 ;)
标签: c# .net multithreading mono backgroundworker