私はMonoに苦境に陥っています。BackgroundWorker
インスタンスが同時に実行されない、または少なくとも非常に効率的または迅速に実行されない方法または理由を理解しようとしています。なんらかの理由でスレッドの数が制限されているように見えますが、私は Mono 開発者や .NET 開発者ではないので、SO の兄弟たちに翻弄されています。
次の例を検討してください。
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
2 秒以内に完了するわけではありません。ループから、6 つのワーカーをインスタンス化していることは明らかですが、「Done」と表示されるのは 3 つだけです。6 つすべてが同時に実行されている場合、これらのワーカーが完了するのに 2 秒あれば十分だと思います。
本当の裏話は、問題なく動作するアプリを持っていることです (BackgroundWorker
バックグラウンドで HTTP 経由で画像をフェッチするかなりの数の を使用します)。ただし、違いは、このアプリが C# .NET で実装されていることです。アプリを移植するときMono では、BackgroundWorker
s は一度に 2 つしか実行されていないように見え、結果として HTTP 接続がタイムアウトする傾向があります.これが事実であるかどうかを確認したかったので、上記の例と質問...
何が起きてる?BackgroundWorker
すべてのが同時に実行されないのはなぜですか? 設定する必要があるパラメータはありますか?