Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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时的这种奇怪行为吗? 代码 使用系统; 使用系统线程; 公共委托void LoadingProgressCallback(完成两倍,字符串ItemName); 公共委托void LoadCompleteCallback(int ItemID,string ItemName); 公共静态类程序 { 公共静态void Main(字符串[]args) { LoadTest LoadTest=新的LoadTest(); loadTest.LoadItems(args); } } 公共类负载测试 { 手动复位事件复位事件; int numThreads=0; 公共负载测试() {} 公共void加载项(字符串[]项) { numThreads=0; resetEvent=新的手动resetEvent(错误); foreach(项中的字符串项) { WriteLine(“将{0}添加到线程池”,项); ThreadPool.QueueUserWorkItem ( 代表 { 加载(项,this.progCall,this.compCall); } ); numThreads++; Thread.Sleep(100);//删除此行 } resetEvent.WaitOne(); } public void progCall(完成两个百分点,字符串ItemName) { Console.WriteLine(“{0}:是{1}%完成[THREAD:{2}]”,ItemName,PercentComplete.ToString(),THREAD.CurrentThread.ManagedThreadId.ToString()); } public void compCall(int ItemID,string ItemName) { WriteLine(“{0}:已完成”,ItemName); numThreads--; if(numThreads==0) { resetEvent.Set(); } } public void Load(字符串项、LoadingProgressCallback progressCallback、LoadCompleteCallback completeCallback) { WriteLine(“加载:{0}[线程:{1}]”,项,THREAD.CurrentThread.ManagedThreadId.ToString()); 对于(int i=0;i程序项1第2项_C#_Multithreading_Threadpool - Fatal编程技术网

C# 有人能解释一下使用ThreadPool时的这种奇怪行为吗? 代码 使用系统; 使用系统线程; 公共委托void LoadingProgressCallback(完成两倍,字符串ItemName); 公共委托void LoadCompleteCallback(int ItemID,string ItemName); 公共静态类程序 { 公共静态void Main(字符串[]args) { LoadTest LoadTest=新的LoadTest(); loadTest.LoadItems(args); } } 公共类负载测试 { 手动复位事件复位事件; int numThreads=0; 公共负载测试() {} 公共void加载项(字符串[]项) { numThreads=0; resetEvent=新的手动resetEvent(错误); foreach(项中的字符串项) { WriteLine(“将{0}添加到线程池”,项); ThreadPool.QueueUserWorkItem ( 代表 { 加载(项,this.progCall,this.compCall); } ); numThreads++; Thread.Sleep(100);//删除此行 } resetEvent.WaitOne(); } public void progCall(完成两个百分点,字符串ItemName) { Console.WriteLine(“{0}:是{1}%完成[THREAD:{2}]”,ItemName,PercentComplete.ToString(),THREAD.CurrentThread.ManagedThreadId.ToString()); } public void compCall(int ItemID,string ItemName) { WriteLine(“{0}:已完成”,ItemName); numThreads--; if(numThreads==0) { resetEvent.Set(); } } public void Load(字符串项、LoadingProgressCallback progressCallback、LoadCompleteCallback completeCallback) { WriteLine(“加载:{0}[线程:{1}]”,项,THREAD.CurrentThread.ManagedThreadId.ToString()); 对于(int i=0;i程序项1第2项

C# 有人能解释一下使用ThreadPool时的这种奇怪行为吗? 代码 使用系统; 使用系统线程; 公共委托void LoadingProgressCallback(完成两倍,字符串ItemName); 公共委托void LoadCompleteCallback(int ItemID,string ItemName); 公共静态类程序 { 公共静态void Main(字符串[]args) { LoadTest LoadTest=新的LoadTest(); loadTest.LoadItems(args); } } 公共类负载测试 { 手动复位事件复位事件; int numThreads=0; 公共负载测试() {} 公共void加载项(字符串[]项) { numThreads=0; resetEvent=新的手动resetEvent(错误); foreach(项中的字符串项) { WriteLine(“将{0}添加到线程池”,项); ThreadPool.QueueUserWorkItem ( 代表 { 加载(项,this.progCall,this.compCall); } ); numThreads++; Thread.Sleep(100);//删除此行 } resetEvent.WaitOne(); } public void progCall(完成两个百分点,字符串ItemName) { Console.WriteLine(“{0}:是{1}%完成[THREAD:{2}]”,ItemName,PercentComplete.ToString(),THREAD.CurrentThread.ManagedThreadId.ToString()); } public void compCall(int ItemID,string ItemName) { WriteLine(“{0}:已完成”,ItemName); numThreads--; if(numThreads==0) { resetEvent.Set(); } } public void Load(字符串项、LoadingProgressCallback progressCallback、LoadCompleteCallback completeCallback) { WriteLine(“加载:{0}[线程:{1}]”,项,THREAD.CurrentThread.ManagedThreadId.ToString()); 对于(int i=0;i程序项1第2项,c#,multithreading,threadpool,C#,Multithreading,Threadpool,输出将如下所示 将item1添加到线程池 加载:item1[线程:3] 第1项:为0% 完成[线程:3] 将项目2添加到线程池 加载:item2[线程:4] 项目2:已完成0%[线程:4] 项目1:完成1%[线程:3] 第2项:1%完成[线程:4] 项目1:已完成2%[线程:3] 第2项:已完成2%[线程:4] 但是,如果我删除这一行 Thread.Sleep(100);//删除此行 从LoadItems方法中,输出如下所示 将item1添加到线程池 将项目2添加到线程池 加载:item2[线程

输出将如下所示

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

但是,如果我删除这一行

Thread.Sleep(100);//删除此行

LoadItems
方法中,输出如下所示

将item1添加到线程池
将项目2添加到线程池
加载: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++;
使用:


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