非异步方法中的异步库方法用法

时间:2017-02-05 22:04:06

标签: c# async-await

我创建了一个日志库,并且在进入DB时,log方法返回错误号(PK),我在其UI上将错误消息的一部分通知给用户。当他们与支持团队交谈时,他们会进一步使用该密钥作为参考。

我有一个异步方法来做同样的事情,如下所示:

public class Logger
{
  public async Task<string> LogAsync(Exception ex)
  {
    return await DoLogAsync(ex);
  } 

  // some private method, with multiple optional parameters
  private Task<string> DoLogAsync(Exception ex)
  {
    return Task.Run(() => Log(ex));
  }
}

注意:我承认,这个异步版只不过是简单地在Task.Run中包装同步方法Log()。我不确定,还有什么应该做的!!

现在,我打算在我的所有API中使用上面的Log()方法,如下所示:

public Result<MyObject> Get()
{
  var result = new Result<MyObject>();

  try
  {
    throw new DivideByZeroException();
  }
  catch (DivideByZeroException ex)
  {
    string errorId = await _logger.LogAsync(ex);
    response.AddErrorMessage("Please Contact Admin with this error #"+errorId);
  }

  return result;
}

为了完成上述工作,我需要使API方法异步,因为我正在等待记录器调用。

  1. 我应该如何避免更改我的API调用异步,只是为了记录器?使这项工作的其他可能性有哪些?
  2. 你认为,LogAsync()真的有益吗?我的UI线程将等待返回错误号,那么为什么不调用同步方法?
  3. 很少有Log()方法,它们不需要错误编号,作为回报,有点遗忘。您是否认为,异步版本在这种情况下会有所帮助,因为UI不会期待任何回复?
  4. 答案:对于问题1,这有效:Waiting for async/await inside a task

    对于2和3,让ADO.Net实现更有意义,而不是Task.Run

2 个答案:

答案 0 :(得分:0)

如果您使用的是Web API,如果该方法不是真正的 async,我就不会使用Log async方法。看看Stephen Cleary的this回答。

答案 1 :(得分:0)

如果您在代码中开始使用async-await方法,请注意async将遍布应用程序的整个管道。

所以

  

我应该如何避免更改我的API调用异步,只是为了   记录仪?使这项工作的其他可能性有哪些?

答案:请勿使用async

  

你认为,LogAsync()真的会有益吗?我的UI线程会   等待错误号码返回,所以为什么不呢   只是调用同步方法?

答案:好处是在等待期间,UI将“响应” - 例如,用户可以在另一个屏幕上移动应用程序的窗口或将其最小化。

  

很少有Log()方法,它们不需要错误号   回归,记录和遗忘。您认为,异步版本将是   在这种情况下有用,因为UI不会期待任何回复?

答案:与之前的答案相同