2012-01-04 105 views
2

我正在開發一些涉及從某個服務器讀取消息,註冊事件處理程序並依次調用處理程序的系統。如何驗證某些回​​調被異步調用(按順序)

我正在使用.NET 3.5,因此請注意,.NET 4或異步的解決方案不可用。

該代碼是與此類似(去掉了一些部件爲了簡明):

 // Loop until receiving timeout. 
     while (!timedOut) 
     { 
      if ((message = connection.Receive) != null) 
      {      
       if (message.Id == Error.MessageId) 
       { 
        throw new Exception("Something wrong happened!!"); 
       } 

       // This calls the event handler (if registered). 
       HandleEvent(message); 

       if (finishedEvents) 
       { 
        // Finished. 
       } 
       else 
       { 
        // If message matches the requested message. 
        if (message.Id == expectedEvents[index].MessageId) 
        { 
         index++; 
        } 

        // Finished processing all messages. 
        if (index == expectedEvents.Length) 
        { 
         finishedEvents = true; 

         continue; 
        } 
      } 
      else 
      { 
       break; 
      } 
     } 

目前我有其中i有一個循環讀取消息並觸發正確的處理程序的同步(阻塞)實現。

這樣,我可以很容易地驗證事件正在按順序被解僱。

我想切換到異步實現,其中事件將異步觸發,而不是在循環中讀取它們。

如何在此實現中驗證事件是按順序接收的?有沒有解決這個問題的標準方案?

回答

1

或另一個解決方案我們Reactive Framework,並使用ForEach循環中的異步呼叫集合,就像一個普通的。

請參閱this answer和樣品的在線文檔。

+0

謝謝,會檢查出來。 – 2012-01-04 11:39:36

1

我覺得一般的設計應該是這樣的(僞代碼):

int currentIndex = 0; 
List<myObject> lst = getList(); 
executor.BeginAsyncTask(lst[currentIndex], AsyncTaskCallBack) 
function AsyncTaskCallBack(result) 
{ 
    if(result.IsOK) 
    { 
     currentIndex+=1; 
     if(currentIndex < lst.Count) 
     executor.BeginAsyncTask(lst[currentIndex], AsyncTaskCallBack) 
    } 
} 

使用的設計,你會處理,只有當一個對象完成下一個對象,它不會阻止你的代碼。 如果您想在ASP.NET中執行此操作,實現可能會有所不同......當您在等待AsyncTaskCallBack執行時,請求處理可能已完成並已發送至瀏覽器。

+0

這在這種情況下不起作用。我只向服務器提交一條消息。服務器響應幾條消息,從中我想驗證一些特定順序的特定順序。 – 2012-01-04 19:28:50

+0

@liortal好吧,看起來像我誤解了你的需求:)嘗試[這個簡單的文章](http://www.codeproject.com/KB/threads/eventsthreadsync.aspx)。使用ManualResetEvent來創建一個與synchronized事件異步的類並不困難。 – 2012-01-04 20:15:54