我对 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");
}
}
}
当我运行上述内容时,我得到以下输出。
开始 开始 完毕 开始 开始 完毕 开始 完毕 真的完成了
首先,并非所有的BackgroundWorker
s 都在整整两秒内完成。从循环中,很明显我正在实例化 6 个工作人员,但只有 3 个打印“完成”。如果所有 6 人同时运行,我觉得两秒钟应该足以让这些工作人员完成。
真正的内幕是我有一个运行良好的应用程序(使用大量BackgroundWorker
通过 HTTP 在后台获取图像的 s。但是,不同之处在于这个应用程序是用 C# .NET 实现的。当我移植应用程序时对于 Mono,BackgroundWorker
s 似乎一次只运行几个,因此 HTTP 连接很容易超时。我想看看是否是这种情况,因此上面的示例和问题......
这里发生了什么?为什么不是所有的BackgroundWorker
s 都同时运行?我需要设置一些参数吗?