【发布时间】:2017-02-05 22:04:05
【问题描述】:
我创建了一个日志库,日志方法在进入数据库时返回一个错误号 (PK),我将其作为用户界面上的错误消息的一部分通知用户。他们在与支持团队交谈时进一步使用该密钥作为参考。
我有一个异步方法来做同样的事情,如下所示:
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));
}
}
注意:我承认,这个异步版本只是简单地将同步方法 Log() 包装在 Task.Run 中。我不确定,还应该怎么做!!
现在,我计划在我的所有 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 方法异步,因为我正在等待记录器调用。
- 我应该如何避免更改我的 API 调用异步,只是为了 Logger?使这项工作有哪些其他可能性?
- 您认为
LogAsync()真的有用吗?我的 UI 线程无论如何都会等待返回错误号,那么为什么不直接调用同步方法呢? -
Log()方法很少,不需要错误号,作为回报,有点像 log-and-forget。你认为异步版本在这种情况下会有所帮助吗,因为 UI 不会有任何回报?
答案:对于问题 1,这有效:Waiting for async/await inside a task
对于 2 和 3,使用 ADO.Net 实现比 Task.Run 更有意义
【问题讨论】:
-
这是一个网络应用吗?
-
那是c#...请在标签中间:)
-
C# 是一门语言。您可以将 C# 用于 ASP.Net 应用程序以及 Web API。
-
是的!目前是 WebAPI,但我们还有许多其他消费者
-
所以.. 在这种情况下,您知道 c# 正在您的 服务器 上运行...无论如何.. 请查看此帖子:stackoverflow.com/questions/24777253/…
标签: c# async-await