【问题标题】:Using Polly to run async task with timeout使用 Polly 运行具有超时的异步任务
【发布时间】:2018-07-23 23:34:59
【问题描述】:

我有一个简单的任务,我想在后台运行。该任务应该只是尝试移动一个文件。此任务可能会失败,因为该文件正在另一个进程中使用。

我想在指定的时间段内重试此操作,如果文件仍处于锁定状态,然后timeout

我阅读了有关 Polly 的信息,并认为这非常适合我的需求。

代码最终将包含在 ASP.NET 应用程序中,但我创建了一个小型 控制台 应用程序以尝试展示我想要实现的目标。

这是我第一次尝试使用Polly,所以我在这里可能完全不合时宜,但是一旦我在Visual Studio 2013 中运行应用程序,我就会收到以下错误:

An unhandled exception of type 'System.InvalidOperationException' occurred in mscorlib.dll

Additional information: Please use asynchronous-defined policies when calling asynchronous ExecuteAsync (and similar) methods.

代码如下:

class Program
    {
        static void Main(string[] args)
        {
            RunMyTask().GetAwaiter().GetResult();
        }

        private static async Task RunMyTask()
        {
            var timeoutPolicy = Policy.Timeout(TimeSpan.FromSeconds(20), TimeoutStrategy.Pessimistic, (context, span, arg3) => {});
            var policyResult = await timeoutPolicy.ExecuteAndCaptureAsync(async () =>
            {
                await Task.Run(() =>
                {
                    while (!MoveFiles())
                    {
                    }
                });
            });
            if (policyResult.Outcome == OutcomeType.Failure && policyResult.FinalException is TimeoutRejectedException)
            {
                Console.WriteLine("Operation Timed out");
            }
            else
            {
                Console.WriteLine("Operation succeeded!!!!!");
            }
        }

        private static bool MoveFiles()
        {
            try
            {
                var origFile = @"c:\temp\mydb.sqlite";
                var tempFile = @"c:\temp\mydb.sqlite.tmp";
                File.Move(origFile, tempFile);
                File.Move(tempFile, origFile);
                return true;
            }
            catch (Exception)
            {
                return false;
            }

        }

我做错了什么?

【问题讨论】:

    标签: c# async-await polly


    【解决方案1】:

    您需要使用Timeoutasync 变体以及async 执行方法。 Polly 的每个策略都有async 变体,因此您需要一直使用async

    TimeoutPolicy timeoutPolicy = Policy
      .TimeoutAsync([int|TimeSpan|Func<TimeSpan> timeout]
                    [, TimeoutStrategy.Optimistic|Pessimistic]
                    [, Func<Context, TimeSpan, Task, Task> onTimeoutAsync])
    

    From Timeout policy

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    相关资源
    最近更新 更多