2013-05-28 3 views
1

이벤트가 여러 번 발생했습니다. 각각의 실행은 입력을 처리 할 스레드를 생성하며 이러한 처리는 순차적이어야합니다.C# : 스레드 대기 대기열 관리

void TcpClient_DataRead(object sender, DataReadEventArgs e) 
    { 
     //the first stops the other ones 
     this.parsingXML.WaitOne(); 
     //processing the string 
     string pop = Encoding.ASCII.GetString(e.Data); 
     BufferizeXML(pop); 
     //restoring execution 
     this.parsingXML.Set(); 
    } 
여기

내가 다른 스레드 대기를하고 이전의 실행이 종료 된 후 복원을 시도했지만,이 솔루션은 모든 대기 스레드를 복원

는 코드입니다.

대기중인 스레드의 대기열을 관리하는 방법이 있습니까?

+2

TPL DataFlow의 멋진 작업 소리 : http://msdn.microsoft.com/en-us/library/hh228603.aspx – spender

답변

5

일반적으로 publish-consumer 패턴을 사용할 수 있습니다. Queue<T> 또는 ConcurrentQueue<T>을 사용하여 이벤트를 대기열에 넣은 다음 단일 스레드가 대기열에서 풀어서 실제 처리를 실행하도록 할 수 있습니다. 순차적으로 실행해야한다고 말한 이후에 하나의 스레드 만 필요합니다. 그러면 스레드 생성 시간을 피할 수 있습니다. 당신이 (이전 버전의 프레임 워크를 사용해야하기 때문에) 동시성 버전을 사용할 수 없다면 대기열 액세스를 잠그어야한다는 사실을 계속 지켜보십시오.

+2

+1, 예, 또한 초보자가 항상 잘못 처리하는 스레드 관리를 피하십시오. 더 많은 경험을 가진 사람들은 절대로 시도하지 않습니다. 불행히도, OP는 항상 스레드를 생성하고 스레드가 join() 등으로 끝내기를 기다리는 것처럼 보이는 'Introduction to Threads'서적/사이트를 많이 읽는 것으로 보입니다. 이전에 여러 번 게시 했으므로 저자는 스테이크에 묶여 야하며 책/인쇄물이 쌓여 토치가 적용되었습니다. –

0

응용 프로그램 초기화, 동시 대기열 작성, 데이터 읽기 작업 시작 및 그 뒤의 이벤트 핸들러 바인드 작업을 시작하십시오.

ConcurrentQueue<DataReadEventArgs> list; 
Init() 
{ 
    var list = new ConcurrentQueue<DataReadEventArgs>(); 
    Task.Factory.StartNew(()=>DataRead()); 
    OnTcpClientDataRead += TcpClient_DataRead; 
} 

// 발행인

void TcpClient_DataRead(object sender, DataReadEventArgs e) 
{ 
    list.Enqueue(e); 
} 
목록이 비어있는 경우 대기열에있는 모든 데이터에 대한 처리 BufferizeXml가, 다시 // 소비자에게 계속 두 번째의 일시 정지를 받아

항시 실행중인 작업

void DataRead() 
{ 
    while(true) 
    { 
    if (list.Count ==0) 
    Thread.Sleep(1000); 

    string pop; 
    list.TryDequeue(out pop); 
    Encoding.ASCII.GetString(pop); 
    BufferizeXML(pop); 
    } 
} 

일부 변수를 넣고 while 루프가 반복을 위반했는지 확인하도록 할 수 있습니다.

+0

TcpClient_DataRead에 2 개의 스레드가 동시에 액세스하면 어떻게됩니까? 이 경우에는 작동하지 않으므로 처음부터 초기화해야합니다. –

+1

@FelixK 코드를 변경했습니다. –