2012-11-14 2 views
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; } 
    } 

왜 항상 기다리고있는 것입니까?

+0

궁극적 인 목표는 무엇입니까? 스레드를 시작하지만 작업을 직렬화하는 경우, 이는 하나의 작업자 스레드를 가질 수 있고 작업 항목을 저장하는 데 ConcurrentQueue를 사용할 수있는 Producer-Consumer와 유사합니다. – pstrjds

+0

다음과 같은 코드가 표시되면 nextEvent = nextEvent = new ManualResetEvent (false); 필자는 저자가 자신의 코드를 너무 열심히 보지 않았다고 생각하는 경향이있다. 당신이 실제로하려고하는 것이 불분명합니다. –

답변

1

CloseAll 메서드에 무한 루프가 있습니다. WaitAll은 모든 이벤트가 신호를 받으면 true을 반환합니다. 비어있는 while 루프가 필요하지 않으므로 라인을 추가하십시오.

WaitHandle.WaitAll(meList.ToArray());