我正在开发一些涉及从某个服务器读取消息,注册事件处理程序并依次调用处理程序的系统。
我使用的是.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;
}
}
目前我有一个同步(阻塞)实现,其中我有一个循环来读取消息并触发正确的处理程序。
通过这种方式,我可以轻松验证按顺序触发事件。
我想切换到一个异步实现,其中事件将异步触发,而不是在循环中读取它们。
如何在此实施中验证按顺序接收事件?有这个问题的标准解决方案吗?
答案 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可能已经完成并已经发送到浏览器。