2012-12-14 2 views
0

UDP 리스너 윈도우 응용 프로그램에서 UDP 메시지가 응용 프로그램에 도달하면이 udp 메시지와 관련된 루틴을 수행하는 새로운 전용 스레드를 만듭니다.자식 스레드에서 실행이 보류 되어도 루틴을 비동기 적으로 실행 하시겠습니까?

이 루틴은 비동기 적으로 호출됩니다.

왜 비동기입니까?

주로 비동기 호출이 스레드 풀에 대기하므로 (각 스레드가 동기화를 실행하게하는 경우가 아니라) 순서가 유지되도록해야합니다.

내 질문 :이 자식 스레드에서 비동기 적으로도이 루틴 실행 루틴을 실행하는 것이 좋습니다

  • 인가?
  • 예인 경우이 비동기 호출에 대해 IsBusy를 가장 잘 구현해야합니다. 심지어 화재 및 잊어 버린 패턴일까요?

나는 내가

내 나쁜 영어

감사에 대한 사과 달성 싶어 무엇을 잘 explianing하고 희망

xPridex

NB : 내가 많이 삭제가이없는 정확한 코드 lisibity에 관한 세부 사항.

/// <summary> 
/// Launch SendNotificationToEBSECW treatment. 
/// </summary> 
/// <param name="sender">object : UDPmsg_t_Mapping</param> 
private void StartPrepared(object sender) 
{ 
      mainThread = new Thread(new ParameterizedThreadStart(EntryPointV3)); 
      mainThread.Start(sender); 
} 

private readonly object _sync = new object(); 
private bool _myTaskIsRunning = false; 

public bool IsBusy 
{ 
    get { return _myTaskIsRunning; } 
} 


public void DoWorkAsynch(Tuple.Create(x,y)) 
{ 
    MyTaskWorkerDelegate worker = new MyTaskWorkerDelegate(EntryPointV3); 
    AsyncCallback completedCallback = new AsyncCallback(MyTaskCompletedCallback); 

    lock (_sync) 
    { 
    if (_myTaskIsRunning) 
     throw new InvalidOperationException("currently busy."); 

    AsyncOperation async = AsyncOperationManager.CreateOperation(null); 
    worker.BeginInvoke(Tuple.Create(x,y), completedCallback, async); 
    _myTaskIsRunning = true; 
    } 
} 

private void MyTaskCompletedCallback(IAsyncResult ar) 
{ 
    // get the original worker delegate and the AsyncOperation instance 
    MyTaskWorkerDelegate worker = 
    (MyTaskWorkerDelegate)((AsyncResult)ar).AsyncDelegate; 
    AsyncOperation async = (AsyncOperation)ar.AsyncState; 

    // finish the asynchronous operation 
    worker.EndInvoke(ar); 

    // clear the running task flag 
    lock (_sync) 
    { 
    _myTaskIsRunning = false; 
    } 

    // raise the completed event 
    AsyncCompletedEventArgs completedArgs = new AsyncCompletedEventArgs(null, 
    false, null); 
    async.PostOperationCompleted(
    delegate(object e) { OnMyTaskCompleted((AsyncCompletedEventArgs)e); }, 
    completedArgs); 
} 

public event AsyncCompletedEventHandler MyTaskCompleted; 

protected virtual void OnMyTaskCompleted(AsyncCompletedEventArgs e) 
{ 
    if (MyTaskCompleted != null) 
    MyTaskCompleted(this, e); 
} 
+0

"새로운 전용 스레드를 만드는 방법"과 "호출하는 방법"을 알려주십시오. –

+0

코드를 추가하기 위해 게시물을 업데이트하기 만하면됩니다. – xPridex

답변

1

이 그 코드를 분명히 아무 문제가 없지만, 나는 몇 가지 의견이 않습니다

  • new Thread

    스레드 풀을 사용하지 않는, 그것은 항상 새로운 전용 스레드를 생성한다.
  • 새 전용 스레드를 만들거나 스레드 풀을 사용하지 않으면 스레드 스케줄링, 완료된 작업 및 제어 할 수없는 기타 작업으로 인해 스레드가 순서대로 완료되지 않습니다.

받은 순서대로 메시지를 처리해야하는 경우 별도의 스레드에서 각 메시지를 처리하면 안됩니다. 대신 각 메시지를 큐에 추가하고 큐의 각 항목을 백그라운드 스레드에서 순차적으로 처리하십시오.

스레드에는 작성자에게 경고를 보내거나 결과를 반환하는 기본 제공 방법이 없습니다. 그렇게하고 싶다면 System.MulticastDelegate.BeginInvoke; 스레드 풀을 사용합니다. 스레드가 실행되는 동안 중간 결과를 원하면 BackgroundWorker을 사용하십시오.

+0

깊은 감사를위한 많은 정보 Dour High Arch, 이제 알았습니다. – xPridex

관련 문제