如何对DotNetCircuitBreaker进行异步调用

时间:2016-06-02 13:19:30

标签: c# multithreading circuit-breaker

我正在使用DotNetCircuitBreaker并试图像这样调用异步metod

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&#34; int&#34;到System.Func&#34; System.Threading.Tasks.Task&#34;

如何使用

修复我的计算方法

2 个答案:

答案 0 :(得分:0)

看起来CircuitBreaker.ExecuteAsync需要一个类型为Func<Task<T>>的参数。您提供的是Task<T>

要修复它,您可以使用lambda表达式,如

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

答案 1 :(得分:0)

我同意Dirk,因为您目前还没有遵守预期的参数签名。另外,您是否考虑过查看Polly library提供的断路器?它非常成熟,并且根据其roadmap有很多功能,包括一些与Netflix的Hystrix断路器库(java)提供的功能相匹配或超出功能的功能。