c# - 为什么计数器在线程池中不起作用

标签 c# multithreading threadpool threadpoolexecutor

我使用线程池创建了一个简单的应用程序,但是当我在线程池内部或外部执行计数器时,它在所有情况下都只返回零或非连续数?

我的程序 [我正在发送 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/

相关文章:

c# - Distinct() 返回 List<> 返回重复项

c# - 无法将类型 'System.Collections.Generic.IEnumerable<AnonymousType#1>' 隐式转换为 'System.Collections.Generic.List<CUSTOM DATA TYPE>

c++ - 与 boost::condition_variable 的线程同步

java - ExecutorService 挂起

c# - LINQ - 在 IEnumerable 中选择第二个项目

java - 使用 2 个不同的类打印偶数和奇数

java - 寻找更好的方式记录wait()和notify()方法

c# - WPF TPL 重新启动取消的任务

java - 如何等待 ExecutorService 中正在运行的线程之一完成以分配另一个任务

c# - 对象字典不适用于 JSON