我在使用Mono时遇到了问题。我试图理解为什么BackgroundWorker
实例不会并发运行,或者至少不是非常高效或快速的。它似乎是线程数量被某种方式限制了,但我不是一个很好的Mono开发者或.NET开发者,所以我向我的Stack Overflow兄弟们求助。
考虑以下示例:
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都能在两秒钟内完成。从循环中可以看出,我实例化了6个workers,但只有3个打印出“Done”。如果所有6个workers同时运行,则我认为两秒钟应该足够它们全部完成。
事实上,我有一个应用程序,在C# .NET中运行良好(使用大量的BackgroundWorker在后台获取图像)。然而,问题在于我将应用程序移植到Mono平台后,仅有少数几个BackgroundWorker同时运行,因此HTTP连接容易超时。因此,我想进行上述示例并询问以下问题...
这里发生了什么?为什么不是所有的BackgroundWorker同时运行?是否需要设置某些参数?