Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有人能解释一下使用ThreadPool时的这种奇怪行为吗? 代码 观察_C#_Multithreading_Threadpool - Fatal编程技术网

C# 有人能解释一下使用ThreadPool时的这种奇怪行为吗? 代码 观察

C# 有人能解释一下使用ThreadPool时的这种奇怪行为吗? 代码 观察,c#,multithreading,threadpool,C#,Multithreading,Threadpool,如果我从命令行运行这个程序,像这样 >程序第1项第2项 输出将如下所示 将item1添加到线程池 加载:item1[线程:3] 第1项:为0% 完成[线程:3] 将item2添加到线程池 加载:item2[线程:4] 项目2:已完成0%[线程:4] item1:完成了1%[线程:3] 第2项:1%完成[线程:4] 第1项:完成2%[线程:3] 第2项:已完成2%[线程:4] 但是,如果我删除这一行 线程100//删除此行 从LoadItems方法中,输出如下所示 将item1添加到线程池 将it

如果我从命令行运行这个程序,像这样

>程序第1项第2项

输出将如下所示

将item1添加到线程池 加载:item1[线程:3] 第1项:为0% 完成[线程:3] 将item2添加到线程池 加载:item2[线程:4] 项目2:已完成0%[线程:4] item1:完成了1%[线程:3] 第2项:1%完成[线程:4] 第1项:完成2%[线程:3] 第2项:已完成2%[线程:4]

但是,如果我删除这一行

线程100//删除此行

从LoadItems方法中,输出如下所示

将item1添加到线程池 将item2添加到线程池 加载:item2[线程:4] 加载:item2[线程:3] 项目2:已完成0%[线程:4] 项目2:已完成0%[线程:3] 第2项:1%完成[线程:4] 第2项:1%完成[线程:3] 第2项:完成2%[线程:3] 第2项:已完成2%[线程:4]

问题
看起来好像使用了两个线程,尽管它们似乎都在处理相同的数据。为什么代码的行为是这样的

您正在关闭循环变量,这会给您一个意外的结果。请尝试以下方法:

foreach(string item in Items)
{
    string item2 = item;
    Console.WriteLine("Adding {0} to ThreadPool", item2);
    ThreadPool.QueueUserWorkItem
    (
        delegate
        {
            Load(item2, this.progCall, this.compCall);
        }
    );
    numThreads++;

    Thread.Sleep(100);//Remove this line

}
参考资料


在查看代码时,我马上想到的一件事是没有使用联锁

你必须使用,否则你会看到奇怪的错误和行为

所以不是

numThreads++;
使用:


+很好,我盯着代码看了5分钟,根本没看到。光是这个问题就必须有至少500个问题。到目前为止,我已经回答了一些问题。我会在compCall方法中调用Interlocked.Decrementref numThreads吗?
numThreads++;
Interlocked.Increment(ref numThreads);