0

我正在使用 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 方法

4

2 回答 2

0

我同意 Dirk,因为您目前没有遵守预期的参数签名。顺便说一句,您是否考虑过研究Polly 库提供的断路器?它非常成熟,并且根据其路线图具有很多功能,包括一些匹配或超过 Netflix 的 Hystrix 断路器库 (java) 提供的功能的功能。

于 2016-06-02T22:08:34.183 回答
0

看起来CircuitBreaker.ExecuteAsync需要一个 type 的参数Func<Task<T>>。你提供的是一个Task<T>.

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

var result = await circuitBreaker.ExecuteAsync(() => Calc(4, 4));
于 2016-06-02T13:31:45.517 回答