2012-12-14 82 views
0

我正在使用UDP偵聽器Windows應用程序,一旦UDP消息到達應用程序,我創建了一個新的專用線程,它執行與此udp消息相關的例程。即使在子線程中執行執行也會異步運行例程?

這個例程被稱爲異步。

爲什麼是異步?

主要是爲了保持UDP到達的順序,因爲異步調用在線程池中排隊(而不是如果我讓每個線程運行同步)。

我的問題:

  • 是它的一個子線程異步運行的程序,即使這個程序運行是一個好主意?
  • 如果是的話,我應該實施IsBusy這個異步調用的最佳實踐,即使它是一個失火和遺忘模式?

我希望我explianing以及什麼我想要實現

道歉我的英文不好

問候

xPridex

注意:這不是正確的代碼,我刪除很多有關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