2012-10-17 3 views
1

나는이 문제를 여러 번 발견하여 대부분 해킹으로 해결했지만이를 수행하는 방법을보고 싶습니다.C# 응답 대기 중 ...

필자는 RPC와 매우 유사한 통신 프로토콜을 작성하고 있습니다. 이는 내 끝점에서 "응답"을받는 "쿼리"를 묻는 방식입니다.

지금 ... 나는 SendCommand라는 함수를 구현하여 쿼리를 보내고 그 질문에 대한 응답을 기다렸다가 반환하려고합니다.

그래서 이것에 대한 문제는 메시지를 보낼 수 있으며 비동기 적으로 받고, 내가 새 메시지가 도착했습니다 이벤트, 어떤 그것이 통지하고 있다는 점이다

int outside_temp = SendCommand(What is the temperature outside).ToInt(); 

뭔가를 할 수 있습니다. 언급 한 쿼리에 대한 응답이 도착할 때까지 스레드를 차단하고 데이터 내용을 추출하여 호출자에게 반환해야합니다.

내 문제는 스레드를 차단하는 것입니다. 스레드를 차단하는 것은 문제가되지 않습니다. 우리는 멀티 스레드 응용 프로그램에 대해 이야기하고 있습니다. 따라서 UI는 멈추지 않을 것입니다. 그러나 문제는 이것을 달성하는 올바른 방법은 무엇입니까?

SendCommand 함수 내에서 세마포어를 초기화하고 기다리며 메시지 수신 이벤트 핸들러에서 세마포어를 해제하는 방법을 생각해 봅니다 (올바른 메시지인지 확인한 후).

감사합니다, axos88 당신 인 sendCommand가 신호를 보낼 때까지 단지 수면으로까지 스레드를 대기 당신이, 인 sendCommand (..)를 호출하고 새 스레드를 회전한다 할 수

+2

당신은 C# 5에 의해 제공되는 비동기 방법을 조사한다 작업 기반 비동기 패턴을 따르는 코드를 만들 수 있다면 나머지는 * 훨씬 * 더 간단해질 것입니다. –

답변

2

그래서 질문은 현재 스레드를 차단하고 응답을 기다립니다 대해입니까? ManualResetEvent를 사용하여 호출자와 콜백을 동기화합니다.

당신이, 당신이이처럼 SendCommand 방법을 코딩 할 수 있습니다 콜백 메서드를 받아들이는 객체의 전송 방법을 통해 RPC 호출을 보낼 수 있습니다 세웠 :

int SendCommand(int param) 
{ 
    ManualResetEvent mre = new ManualResetEvent(false); 

    // this is the result which will be set in the callback 
    int result = 0; 

    // Send an async command with some data and specify a callback method 
    rpc.SendAsync(data, (returnData) => 
         { 
          // extract/process your return value and 
          // assign it to an outer scope variable 
          result = returnData.IntValue; 
          // signal the blocked thread to continue 
          mre.Set(); 
         }); 

    // wait for the callback 
    mre.WaitOne(); 
    return result; 
} 
0

. 예를 들어

:

volatile bool commandCompleted=false; 
Thread sendCommandThread=new Thread(()=>{ 
    SendCommand(...,()=>{ 
commandCompleted=true; 
}) 

while(!commandCompleted) 
{ 

    Thread.Sleep(100); 
} 
}); 
+0

사용자 스레드 풀 또는 작업 클래스 int .Net 4.0 –

+2

스레드 풀을 작성하지 마십시오. 친애하는 downvoter, ThreadPool 또는 Task 대신 Thread를 사용했기 때문에 다운 투표 한 경우, 그냥 말할 수있는 것이 있습니다. 이런 종류의 문제를 효율적으로 해결하는 방법이 아닙니다. – crypted

+1

실제로는 반대 사례와 피할 수있는 예를 제시했습니다. –