等待事件处理程序的异步

时间:2013-11-27 20:42:16

标签: c# asynchronous msmq

我很困惑如何最好地处理这种情况。我不想等待异步调用的响应。具体来说,我有:

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;

我的问题是,我不明白该怎么做,仍然有这样的等待(即我希望能够等待我现在,但通过委托处理它)。这有意义吗?

1 个答案:

答案 0 :(得分:9)

当您想要将一些基于任务的异步模型转换为基于任务的异步模型时,如果还没有Task方法为您进行转换,则使用{{ 1}}“手动”处理每个案例:

TaskCompletionSource

您需要根据未显示的类型的具体情况进行调整,但这是一般的想法。