【发布时间】:2020-03-28 13:19:23
【问题描述】:
我使用线程池做了一个简单的应用程序,但是当我在线程池内部或外部进行计数器时,它在所有情况下都只返回零或非连续数字?
我的程序 [我正在发送 10000 个有价值的 webrequest [API],我知道线程池更快的方式吗? 因为我想在 5 到 10 分钟内发送和接收 10,000 个请求。 ]
public int Count;
private void TaskCallBack(Object ThreadNumber)
{
MessageBox.Show(Count.ToString());
Interlocked.Increment(ref Count);
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
//// Queue the task.
for (int x = 0; x < 10; x++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskCallBack));
}
this.Count = 0;
}
catch (Exception ex)
{
MessageBox.Show("Error : " + ex);
}
}
【问题讨论】:
-
尝试在
this.Count = 0;和MessageBox.Show(Count.ToString());上添加断点。 -
您将 Count 的值分配为 0。您可能希望在第一行将 Count 初始化为 0 并删除该行:this.Count = 0;
-
我试过了brakpoint,循环后同样的错误还是0
-
经典线程竞赛错误,这个重复得很好。您无法以足够快的速度单击 10 个确定按钮以让所有 10 个线程都进入 Increment() 调用。之后没有人仍然调用 Count.ToString()。 Interlocked 类不能替代
lock。
标签: c# multithreading threadpool threadpoolexecutor