C# 有人能解释一下使用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添加到线程池 将item2添加到线程池 加载:item2[线程:4] 加载:item2[线程:3] 项目2:已完成0%[线程:4] 项目2:已完成0%[线程:3] 第2项:1%完成[线程:4] 第2项:1%完成[线程:3] 第2项:完成2%[线程:3] 第2项:已完成2%[线程:4] 问题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
看起来好像使用了两个线程,尽管它们似乎都在处理相同的数据。为什么代码的行为是这样的 您正在关闭循环变量,这会给您一个意外的结果。请尝试以下方法:
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);