0
다음은 내 코드입니다. 모든 메소드가 항상 대기합니다.C# WaitHandle.WaitAll() 항상 대기 중
class Program
{
static StreamWriter _fileStream;
static void Main(string[] args)
{
_fileStream = File.CreateText(@"C:\Praveen\HelloThread.txt");
List<ManualResetEvent> meList = new List<ManualResetEvent>();
ManualResetEvent currentEvent = new ManualResetEvent(true);
ManualResetEvent nextEvent = new ManualResetEvent(false);
meList.Add(currentEvent);
int length = 10;
Data data = null;
Console.WriteLine("Writing started...");
for (int i = 0; i < length; i++)
{
data = new Data { CurrentEvent = currentEvent, Number = i, NextEvent = nextEvent };
ThreadPool.QueueUserWorkItem(PrintMsg, data);
meList.Add(nextEvent);
currentEvent = nextEvent;
nextEvent = nextEvent = new ManualResetEvent(false);
}
CloseAll(meList);
Console.ReadLine();
}
private static void CloseAll(List<ManualResetEvent> meList)
{
Console.WriteLine("Requested to close all...");
while (WaitHandle.WaitAll(meList.ToArray()))
{
}
Console.WriteLine("Done with the writing...");
}
private static void PrintMsg(object state)
{
Data data = state as Data;
data.CurrentEvent.WaitOne();
string msg = "Hello times...";
for (int j = 0; j < 5; j++)
{
_fileStream.WriteLine(msg + data.Number);
Console.WriteLine(msg + data.Number);
}
data.NextEvent.Set();
}
}
public class Data
{
public ManualResetEvent CurrentEvent { get; set; }
public ManualResetEvent NextEvent { get; set; }
public int Number { get; set; }
}
왜 항상 기다리고있는 것입니까?
궁극적 인 목표는 무엇입니까? 스레드를 시작하지만 작업을 직렬화하는 경우, 이는 하나의 작업자 스레드를 가질 수 있고 작업 항목을 저장하는 데 ConcurrentQueue를 사용할 수있는 Producer-Consumer와 유사합니다. – pstrjds
다음과 같은 코드가 표시되면 nextEvent = nextEvent = new ManualResetEvent (false); 필자는 저자가 자신의 코드를 너무 열심히 보지 않았다고 생각하는 경향이있다. 당신이 실제로하려고하는 것이 불분명합니다. –