2011-04-19 4 views
3

본질적으로, 명백한 것 이상의 차이점은 무엇입니까? 어떤 양식을 사용해야합니까?언제 UdpClient.BeginReceive를 사용해야합니까? 백그라운드 스레드에서 UdpClient.Receive를 사용해야하는시기는 언제입니까?

class What 
{ 
    public Go() 
    { 
     Thread thread = new Thread(new ThreadStart(Go2)); 
     thread.Background = true; 
     thread.Start(); 
    } 
    private Go2() 
    { 
     using UdpClient client = new UdpClient(blabla) 
     { 
      while (stuff) 
      { 
       client.Receive(guh); 
       DoStuff(guh); 
      } 
     } 
    } 
} 

내가 차이는 일반적으로 거대 할 것이라고 생각하지 않지만, 나는 전체 비동기 방식을 선호하는 나는 일시 정지를 기대한다면 (.../끝 ... 시작) 할

class Whut 
{ 
    UdpClient client; 
    public Go() 
    { 
     client = new UdpClient(blabla); 
     client.BeginReceive(guh, new AsyncCallback(Go2), null); 
    } 
    private Go2(IAsyncResult ar) 
    { 
     client.EndReceive(guh, ar); 
     DoStuff(guh); 
     if (stuff) client.BeginReceive(guh, new AsyncCallback(Go2), null); 
     else client.Close(); 
    } 
} 

답변

4

대 콜백은 여분의 스레드를 요구하기보다는 몇 개의 계층에서 오프로드 될 수 있습니다. 비동기 방식의 또 다른 장점은 항상 필요한 데이터를 가져 와서 다른 비동기 페치를 큐에 넣은 다음 존재하는 비동기 스레드에서 새 데이터를 처리하여 병렬 처리 (하나의 읽기, 하나의 처리)를위한 더 많은 옵션을 제공한다는 것입니다. 이것은 물론 수동으로 수행 할 수도 있습니다 (작업 대기열 사용).

물론 프로필 ...

관련 문제