c# - 为什么计数器在线程池中不起作用
问题描述
我使用线程池制作了一个简单的应用程序,但是当我在线程池内部或外部进行计数器时,它在所有情况下都只返回零或非连续数字?
我的程序 [我正在发送 10,000 个有价值的 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);
}
}
解决方案
Count
好吧,您可以让 10 个线程在其中任何一个线程递增值之前都打印出初始值。Count
如果线程在其他线程调用之前递增,也不能保证连续顺序Show
。要同时获得两者,请使用互斥锁来控制对回调逻辑的并发访问:
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);
}
}
推荐阅读
- node.js - NodeJS rhea AMQP 客户端的故障转移
- javascript - 在 Kattis 挑战中获得输入 - readline js
- leaflet - 传单图例出现在选择覆盖功能之前
- symfony - Symfony - 上传文件将我发送到 _wtd url
- python - 从图形中识别不同的回归(线性、多项式)并相应地拟合回归模型
- javascript - Highcharts 直方图剂量显示正确的结果
- html - 为什么我不能将我的 div 放在一起
- c# - 我可以从 WPF 中的代码获取 XAML 中定义的 VisualStateGroups 吗?
- r - 在 R 中拟合非线性数据
- javascript - 如何使用firebase、vue.js和cordova在webapp上实现推送通知?