【发布时间】:2012-07-07 02:44:35
【问题描述】:
我正在寻找一种方法来检查线程池中的所有线程何时完成其任务。目前我正在使用一个计数器,当线程完成它的工作以及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 数量总是比总数少 1,这几乎就像最后一个线程不是“报告回来”之类的。有人有什么想法吗?
谢谢
【问题讨论】:
-
您是否在某处遇到异常?如果是这样,您的 Interlocked.Decrement 调用将不会针对该元素发生...
标签: c# multithreading threadpool interlocked