我尝试使用企业库瞬态故障处理应用程序块(" 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控制器操作调用的,因此我最终会遇到一个异常,即在异步操作挂起时操作已完成。
另外两个例子似乎有用,但两个人都不对。