Как сделать асинхронный вызов DotNetCircuitBreaker

Я использую DotNetCircuitBreaker и пытаюсь вызвать асинхронный метод, подобный этому

private async void button1_Click(object sender, EventArgs e)
{
  var circuitBreaker = new CircuitBreaker.Net.CircuitBreaker(
    TaskScheduler.Default,
    maxFailures: 3,
    invocationTimeout: TimeSpan.FromMilliseconds(100),
    circuitResetTimeout: TimeSpan.FromMilliseconds(10000));

  //This line gets the error... Definition looks like this
  //async Task<T> ExecuteAsync<T>(Func<Task<T>> func)      
  var result = await circuitBreaker.ExecuteAsync(Calc(4, 4));
}

private async Task<int> Calc(int a, int b)
{
  //Simulate external api that get stuck in some way and not throw a timeout exception
  Task<int> calc = Task<int>.Factory.StartNew(() =>
  {
    int s;
    s = a + b;
    Random gen = new Random();
    bool result = gen.Next(100) < 50 ? true : false;
    if (result) Thread.Sleep(5000);
    return s;
  });

  if (await Task.WhenAny(calc, Task.Delay(1000)) == calc)
  {
    return calc.Result;
  }
  else
  {
    throw new TimeoutException();
  }
}

Аргумент 1: невозможно преобразовать из System.Threading.Tasks.Task"int" в System.Func"System.Threading.Tasks.Task"

Как исправить мой метод calc, работающий с

2 ответа

Решение

Это выглядит как CircuitBreaker.ExecuteAsync ожидает параметр с типом Func<Task<T>>, То, что вы предоставили, является Task<T>,

Чтобы исправить это, вы можете использовать лямбда-выражение вроде

var result = await circuitBreaker.ExecuteAsync(() => Calc(4, 4));

Я согласен с Дирком, поскольку вы не придерживаетесь ожидаемой подписи параметра. Кстати, вы рассматривали автоматический выключатель, предоставленный библиотекой Полли? Он достаточно зрелый и обладает множеством функциональных возможностей, соответствующих его плану развития, включая некоторые функции, которые соответствуют или превосходят функциональные возможности, предоставляемые библиотекой автоматического выключателя Netflix Hystrix (java).

Другие вопросы по тегам