EntLib RetryPolicy.ExecuteAsync()和Azure CloudQueue.AddMessageAsync()

时间:2014-04-11 18:09:39

标签: c# azure asynchronous enterprise-library

我尝试使用企业库瞬态故障处理应用程序块(" Topaz")来实现针对Azure存储的异步调用的重试策略,而不是如何组合这两个是正确的。

我应该使用RetryPolicy.ExecuteAction()还是RetryPolicy.ExecuteAsync()

例如(异步执行和异步addmessage):

public async Task AddMessageToQueueAsync(string message)
{
     await myRetryPolicy.ExecuteAsync(() => azureQueue.AddMessageAsync(message));
}

或(同步执行和异步addmessage)

public async Task AddMessageToQueueAsync(string message)
{
     myRetryPolicy.ExecuteAction(async () => 
          await azureQueue.AddMessageAsync(message));
}

或(异步执行和同步addmessage)

public async Task AddMessageToQueueAsync(string message)
{
     await myRetryPolicy.ExecuteAsync(() => azureQueue.AddMessage(message));
}

我需要以某种方式等待任务,因为我无法继续,直到消息成功传递到队列。

我发现的是,第一个示例最终触发了一个任务,该任务作为向队列添加消息的任务触发 - 使我的等待调用无效 - 即await ExecuteAsync()返回立刻,但内心" AddMessageAsync()任务仍在运行。由于此代码是由MVC控制器操作调用的,因此我最终会遇到一个异常,即在异步操作挂起时操作已完成。

另外两个例子似乎有用,但两个人都不对。

0 个答案:

没有答案