首页 > 解决方案 > 为什么计数器在线程池中不起作用

问题描述

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

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

标签: c#multithreadingthreadpoolthreadpoolexecutor

解决方案


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);
        }
    }

推荐阅读