如何验证某些回​​调是异步调用的(按顺序)

时间:2012-01-04 08:58:07

标签: c# .net asynchronous

我正在开发一些涉及从某个服务器读取消息,注册事件处理程序并依次调用处理程序的系统。

我使用的是.NET 3.5,请注意,.NET 4或async的解决方案不可用。

代码与此类似(为简洁起见删除了一些部分):

        // 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;
            }
      }

目前我有一个同步(阻塞)实现,其中我有一个循环来读取消息并触发正确的处理程序。

通过这种方式,我可以轻松验证按顺序触发事件。

我想切换到一个异步实现,其中事件将异步触发,而不是在循环中读取它们。

如何在此实施中验证按顺序接收事件?有这个问题的标准解决方案吗?

2 个答案:

答案 0 :(得分:1)

或另一个解决方案我们Reactive Framework,并使用ForEach循环中的异步调用集合,就像普通的一样。

有关示例,请参阅this answer和在线文档。

答案 1 :(得分: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执行时,请求procprocing可能已经完成并已经发送到浏览器。