Я пытаюсь использовать библиотеку Polly для мониторинга / перезапуска задач, которые не выполняются. Однако мне трудно сохранять одинаковые входные аргументы между попытками повторения.
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;
}
}
}
}
Когда я запускаю этот код, я получаю следующий вывод:
Starting Task 0
Starting Task 1
Hello from task 1
Hello from task 0
Starting Task 2 // BAD! this should be starting task 0
Starting Task 2 // BAD! this should be starting task 1
Hello from task 2
Hello from task 2
Starting Task 2
Starting Task 2
Очевидное Проблема связана с этой строкой: .ExecuteAsync(async () => await Program.TaskMethod(i.ToString()));
Я предоставляю номер задачи в качестве переменной, которая является проблемой, потому что эта переменная переходит в «2» в конце для l oop. Таким образом, идентификатор задачи 2 используется для оставшихся попыток.
Итак, мой вопрос: как бы я переформатировал свое лямбда-выражение так, чтобы оно ссылалось на переменную 'i' только один раз, чтобы оно сохраняло свой исходный идентификатор задачи?