Как проверить определенные обратные вызовы были вызваны асинхронно (по порядку) - PullRequest
2 голосов
/ 04 января 2012

Я занимаюсь разработкой системы, которая включает чтение сообщений с какого-либо сервера, регистрацию обработчиков событий и их вызов по очереди.

Я использую .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 ]

1 голос
/ 04 января 2012

Я думаю, что общий дизайн должен быть примерно таким (псевдокод):

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, обработка запроса может быть завершена и уже отправлена ​​в браузер.

1 голос
/ 04 января 2012

Или другое решение, используя Reactive Framework , и используйте сбор асинхронных вызовов в цикле ForEach, как обычный.

См. этот ответ и онлайндокументация для образцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...