我创建了一个日志库,并且在进入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方法异步,因为我正在等待记录器调用。
LogAsync()
真的有益吗?我的UI线程将等待返回错误号,那么为什么不调用同步方法?Log()
方法,它们不需要错误编号,作为回报,有点遗忘。您是否认为,异步版本在这种情况下会有所帮助,因为UI不会期待任何回复?答案:对于问题1,这有效:Waiting for async/await inside a task
对于2和3,让ADO.Net实现更有意义,而不是Task.Run
答案 0 :(得分:0)
如果您使用的是Web API,如果该方法不是真正的 async
,我就不会使用Log
async
方法。看看Stephen Cleary的this回答。
答案 1 :(得分:0)
如果您在代码中开始使用async-await
方法,请注意async
将遍布应用程序的整个管道。
所以
我应该如何避免更改我的API调用异步,只是为了 记录仪?使这项工作的其他可能性有哪些?
答案:请勿使用async
你认为,LogAsync()真的会有益吗?我的UI线程会 等待错误号码返回,所以为什么不呢 只是调用同步方法?
答案:好处是在等待期间,UI将“响应” - 例如,用户可以在另一个屏幕上移动应用程序的窗口或将其最小化。
很少有Log()方法,它们不需要错误号 回归,记录和遗忘。您认为,异步版本将是 在这种情况下有用,因为UI不会期待任何回复?
答案:与之前的答案相同