backgroundworker
ネットワーク経由で接続するプロセスを実行するために複数を使用しています。の行数に基づいて、datagridview
各行の値をフェッチし、長いプロセスを実行する別のクラス メソッドを通過します。ここでは for ループを使用してバックグラウンド ワーカーを開始しているため、問題はプロセスの開始時であり、行数に基づいてdatagridview
より多くのバックグラウンド ワーカーが実行を開始します。しかし、私はこれを制限したい。たとえば、50 行ある場合、一度に 5 つのバックグラウンド ワーカーを実行したいだけです。それらの 5 つがタスクを終了したら、次の 5 つを開始する必要があります。では、それらを制限する方法は?
次のコードを使用しました:
Backgroundworker bs;
private void button1_Click(object sender, EventArgs e)
{
threadNumber = 0;
threadRunning = 0;
for(int i=0;i<datagridview1.Rows.Count;i++)
{
bs = new Backgroundworker();
bs.DoWork += new DoWorkEventHandler(bs_DoWork);
bs.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bs_Completed);
bs.WorkerSupportCancellation = true;
bs.RunWorkerAsync(i);
}
}
private void bs_DoWork(object sender, DoWorkEventArgs e)
{
int i = (int)e.Argument;
while(bs.CancellationPending !=true && threadNumber < datagridview1.Rows.Count)
{
lock (this)
{
for (int i = 0; i < Max_Threads - threadRunning; i++)
{
if (threadNumber < datagridview1.Rows.Count)
{
Webmethod obj = new webmethod();
obj.Callmethod(i); // this takes long time to perform
threadNumber +=1;
threadRunning +=1;
}
}
}
}
}
しかし、プロセスを開始すると、すべてのバックグラウンドワーカーがタスクを開始します。誰でもこれで私を助けることができますか?
前もって感謝します..