スレッドプール内のすべてのスレッドがいつタスクを終了したかを確認する方法を探しています。counter == 0
現在、スレッドがジョブを終了したとき、およびメソッドを呼び出しているときに減少するカウンターを使用していますWorkComplete
。これは機能しているように見えますが、最終的な「ジョブ」に到達すると、結果を処理していないように見えますか? または、少なくとも UI はそれを取得しません。これが私が現在持っているものです:
ワークアイテムのキューイング + インクリメント カウンター
foreach (string s in URLs)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), s);
Interlocked.Increment(ref counter);
}
仕事する:
public void DoWork(object sender)
{
lock (_threadLock)
{
try
{
string url = (string)sender;
result.URL = url;
if (chkFb.Checked)
{
result.Shares = grabber.GetFacebookShares(url);
}
if (chkTwitt.Checked)
{
result.Tweets = grabber.GetTweetCount(url);
}
if (chkPlusOne.Checked)
{
result.PlusOnes = grabber.GetPlusOnes(url);
}
Interlocked.Decrement(ref counter);
this.Invoke(new ThreadDone(ReportProgress), result);
}
catch (Exception exc)
{
MessageBox.Show(string.Format("Errror: {0}", exc.Message);
}
finally
{
if (counter == 0)
{
this.Invoke(new ThreadDone(ReportProgress), result);
this.Invoke(new Complete(WorkComplete));
}
}
}
}
しかし、処理される URL の量は常に合計数よりも 1 少なくなります。これは、最後のスレッドが 'Reporting back' などではないようなものです。誰にもアイデアはありますか?
ありがとうございました