【发布时间】:2013-11-28 04:48:00
【问题描述】:
我对如何最好地处理这种情况感到困惑。我不想等待异步调用的响应。具体来说,我有:
public async Task<IApiData> FetchQueuedApiAsync(TimeSpan receiveTimeout)
{
var message = await Task.Factory.FromAsync<Message>(
ReadQueue.BeginReceive(receiveTimeout), ReadQueue.EndReceive);
return message.Body as IApiData;
}
这按预期工作。但是,如果超时到期,则不得调用 ReadQueue.EndReceive,否则将引发异常。显然 FromAsync 不知道这一点并盲目地调用它 - 触发异常。超时时不调用 EndReceive 的要求是由 MSMQ 实现的,超出了我的控制范围。
当消息准备好或发生超时时,队列会公开一个事件。这是您通常检查消息是否存在的地方,然后根据文档调用 EndReceive。标准监听器......
ReadQueue.ReceiveCompleted += ReadQueue_ReceiveCompleted;
我的问题是我不明白如何做到这一点,并且仍然可以等待(即,我希望能够像现在一样等待,但通过委托处理它)。这有意义吗?
【问题讨论】:
标签: c# asynchronous msmq