2017-01-20 3 views
0

UDP를 통해 메시지를 수신하고 있습니다. 메시지는 으로 매우 빠르게에 도달 할 수 있습니다. 즉, 1ms마다 (즉,이 값이 다를 수 있음) 메시지가 수신되면, 이벤트가 호출된다TaskFactory(). StartNew() 생성 순서대로 완료

가 알 수있는 바와 같이 은 수신 메시지 큐에 넣고

private static void OnMessageReceived(object sender, UDPMessage message) 
{ 
     MessageQueue.Enqueue(message); 
} 
처리한다. UDP 수신자 스레드가 다음 메시지를 수신 할 수 있는지 확인하기 위해이 작업을 수행합니다 (수신 스레드를 차단하지 않고 수신 스레드를 수신하지 못하게하려는 경우). 메시지). 메시지가 대기 할 때

따라서는 MessageQueued 이벤트가 발생합니다 :

private static void MessageQueued(object sender, EventArgs e) 
{ 
    var processTask = new TaskFactory().StartNew(ProcessMessage); 
} 

ProcessMessage 처리의 약간을 수행하고 다음 다른 응용 프로그램 ... 순서로 메시지를 전송하는 이러한 메시지 다른 응용 프로그램에 도착하는 것이 중요합니다.

메시지가 매우 빠르게 도착하는 경우 작성된 ​​작업이 완료된 순서가 작성된 순서와 같지 않을 것이라는 우려가 있습니다.

메시지가 도착하는 순서대로 작업이 만들어지고 동일한 순서로 메시지가 전달되는지 확인해야합니다.

(예, UDP 메시지를 보장 그들이 보낸 순서대로 도착,하지만 잊지 않는다는 것을 알고;))

양식은, 내가 기다릴 필요가 있다고 생각처럼 들리는 이전 작업이 완료 될 때까지 현재 작업을 완료로 표시하기 전에 ... 현재 작업을 시작하기 전에 이전 작업이 완료 될 때까지 기다리지 않으려 고합니다.

나는 이것이 의미가 있기를 바랍니다.

var ProcessMessageQueueLoop = new TaskFactory().StartNew(ProcessMessageQueueThread); 

private static void ProcessMessageQueueThread() 
{ 
    while (true) 
    { 
     if (MessageQueue.Count > 0) 
     { 
      ProcessMessage(); 
     } 
    } 
} 

private static void OnMessageReceived(object sender, UDPMessage message) 
{ 
     MessageQueue.Enqueue(message); 
} 
: 의견에 따라

업데이트

글쎄, 나는 처음에 지속적으로 메시지 큐를 확인하고 항목을 사용할 수 있다면, 대기열하고 처리 작업에 의해 생성 된 루프를 가지고 않았다

이것이 맞는지 확실하지 않아서 조금 놀았습니다. 따라서 제 질문에 대답했습니다.

+0

왜 'Task.Run (...)'과 같은 정적 도우미 중 하나를 사용하지 않습니까? – Aybe

+2

패킷이 도착하는 순서대로 작업이 완료되는지 확인하는 것은 우연히 패킷 자체가 고장날 수있는 경우 무의미한 것으로 보입니다. 나는 당신이 "그것을 무시하라"고 말하지만, 그들을 주문하려고하는 것은 무엇을 의미합니까? 즉, 루프의 메시지를 처리하고 대기열에서 새 메시지를 가져 오는 백그라운드 스레드가 하나만 필요할 것입니다. – Blam

+0

또한 ProcessMessage가 다른 모든 메시지와 정확히 동일한 시간에 각 메시지를 처리하지 않으면 처리중인 메시지의 순서와 다른 순서로 메시지를 대기시킬 수 있습니다. 특정 순서로 메시지를 생성해야하는 경우 메시지를 비동기 적으로 처리하지 않아야합니다. –

답변

1

업데이트 코드는 수신 스레드를 차단하지 않고 순서대로 데이터를 처리하려는 달성하려는 올바른 코드입니다.

+0

물론 가능합니다. 이를위한 많은 도구가 있습니다. 가장 단순한 것은 각각 이전의 연속이되는 것입니다. – Servy

+1

그렇다면 그것은 비동기 적이 아닙니까? – Blam

+0

그 외에도 업데이트의 코드가 정확히 무엇인지, 나는 이것이 올바른 처리 방법이라고 말했습니다. – Blam