我正在寻找一种检查线程池中的所有线程何时完成任务的方法。目前我正在使用一个计数器,当线程完成它的工作以及counter == 0
我调用我的WorkComplete
方法时它会递减。这似乎可行,但是当我到达最后的“工作”时,它似乎没有处理结果?或者至少用户界面没有得到它。这是我目前拥有的:
排队工作项 + 递增计数器
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 的数量总是比总数少一个,这几乎就像最后一个线程不是“报告回来”之类的。有没有人有任何想法?
谢谢