我对如何最好处理这种情况感到困惑。我想等待异步调用的响应。具体而言,我有:
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;
我的问题是我不知道如何既能做到这一点,又能保持此为可等待状态(即我想能够像现在一样等待,但通过委托处理它)。这有意义吗?