以下是我使用的代码。主线程等待线程池线程执行。我使用 AutoResetEvent (WaitHandle),但我真的很惊讶我偏离了标准,因为代码没有按预期运行。
我有两个同心的 for 循环,其中 Threadpool 位于内部循环中,并且预计对于外部循环的每次迭代,都应处理所有内部循环值。使用 AutoResetEvent WaitOne 在内部循环外部调用使主线程等待,这是一个静态变量,在外部循环的每次迭代中重置为内部循环的最大值,并在使用 Threadpool 线程的方法调用中使用 Interlock 递减为 AutoResetEvent 调用 Set。但是,即使我希望静态变量在每个内部循环之后显示值 0,它也不会。我的代码有什么问题,我有什么更好的选择来完成任务?事实上,由于值的混淆,主线程似乎并没有真正等待线程池线程。
using System;
using System.Threading;
namespace TestThreads
{
class Program
{
private static int threadingCounter = 0;
private static readonly object lockThreads = new Object();
private AutoResetEvent areSync = new AutoResetEvent(true);
// <param name="args"></param>
static void Main(string[] args)
{
Program myProgram = new Program();
try
{
try
{
for (int outer = 0; outer < 1000; outer++)
{
threadingCounter = 500;
try
{
for (int inner = 0; inner < 500; inner++)
{
ThreadPool.QueueUserWorkItem(new
WaitCallback(myProgram.ThreadCall), inner);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception :: " + ex.Message);
}
finally
{
myProgram.areSync.WaitOne();
}
if(threadingCounter != 0)
Console.WriteLine("In Loop1, Thread Counter :: " +
threadingCounter);
}
}
catch (Exception ex)
{
Console.WriteLine("Exception :: " + ex.Message);
}
}
catch(Exception ex)
{
Console.WriteLine("Exception :: " + ex.Message);
}
finally
{
threadingCounter = 0;
if (myProgram.areSync != null)
{
myProgram.areSync.Dispose();
myProgram.areSync = null;
}
}
}
public void ThreadCall(object state)
{
try
{
int inner = (int)state;
Thread.Sleep(1);
}
catch (Exception ex)
{
Console.WriteLine("Exception :: " + ex.Message);
}
finally
{
Interlocked.Decrement(ref threadingCounter);
if (threadingCounter <= 0)
areSync.Set();
}
}
}
}