我使用线程池创建了一个简单的应用程序,但是当我在线程池内部或外部执行计数器时,它在所有情况下都只返回零或非连续数?
我的程序 [我正在发送 10,000 个有值(value)的网络请求 [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);
}
}
最佳答案
好吧,您可以让 10 个线程都打印出 Count
的初始值,然后它们中的任何一个都会递增该值。如果线程在其他线程调用 Show
之前递增 Count
,也不能保证连续顺序。要获得两者,请使用互斥锁来控制对回调逻辑的并发访问:
public int Count;
private readonly object _countLock = new Object();
private void TaskCallBack(Object ThreadNumber)
{
lock( _countLock )
{
++Count;
MessageBox.Show(Count.ToString());
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
try
{
// this smells
this.Count = 0;
//// Queue the task.
for (int x = 0; x < 10; x++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(TaskCallBack));
}
}
catch (Exception ex)
{
MessageBox.Show("Error : " + ex);
}
}
关于c# - 为什么计数器在线程池中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59164148/