繁体   English   中英

我应该如何“等待”C# Polly 策略列表?

[英]How should I "await" a list of C# Polly policies?

我正在使用 Polly 库来监视/重新启动 C# 中的任务。 我有一些“愚蠢”的示例代码来测试重启机制。

我注意到我的 'await Task.WhenAll(policy_list.ToArray());' 并不总是等待政策。 相反,这会立即通过。

“无限”等待的正确方法是什么,以便波莉一直监视我的任务?

using System;
using System.IO;
using System.Collections.Generic;
using Polly;
using System.Threading.Tasks;

namespace Sampler
{
    class Program
    {
        public static async Task Main(string[] args)
        {

            // create and execute policies for each sampler
            List<Task> policy_list = new List<Task>();
            for(int i = 0; i < 2; i++)
            {
                var policy = Policy
                    .Handle<Exception>()
                    .RetryForeverAsync()
                    .ExecuteAsync(async () => await Program.TaskMethod(i.ToString()));

                policy_list.Add(policy);
            }

            await Task.WhenAll(policy_list.ToArray());

            Console.WriteLine("Press any key to exit...");
            Console.ReadLine();
        }

        public static async Task TaskMethod(string task_id)
        {
            Console.WriteLine("Starting Task {0}", task_id);
            while (true)
            {
                await Task.Delay(5000);
                Console.WriteLine("Hello from task {0}", task_id);

                int i = 0;
                int b = 32 / i;

            }
        }
    }
}
public async Task AwaitAndProcessAsync<T>(Task<T> task) where T : PolicyResult<ExecutionResult>
{
    var result = await task;
    if (result.Outcome == OutcomeType.Failure)
    {
        var android = result.Context.Values.OfType<AndroidTestHelper>().First();
        if (result.FinalException != null)
        {
            LogsHelper.iLog.Fatal($"{result.Context.First().Key} failed after too many retries!");
        }
    }
}

//where ExecutionResult : enum {PASSED, FAILED}

使用此功能,您可以在并行执行中返回一些值后等待并处理每个任务,如果仅使用Task.WhenAll您将能够在完成所有任务后记录结果!

var list = await GenerateSomeDevices(20);
var tasks = new List<Task<PolicyResult<ExecutionResult>>>();

foreach (var device in list)
{
    var android = new AndroidTestHelper(device);

    var t = bulkHeadPolicy.ExecuteAndCaptureAsync(async (context, _token) =>
    {
        LogsHelper.iLog.Debug($"[{device.Index}] start testing..");
        return await android.TestDriver(_token);
    }, new Dictionary<string, object>() { { $"[{device.Index}] Process", android } }, cancellationToken);

    tasks.Add(t);
    await Task.Delay(10000);
}

var processingTasks = tasks.Select(AwaitAndProcessAsync).ToList();

await Task.WhenAll(processingTasks).ContinueWith((task) =>
{
    if (task.IsCompleted)
        LogsHelper.iLog.Information("DONE");
}, cancelationToken);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM