【发布时间】:2018-07-27 06:18:51
【问题描述】:
我正在尝试实现一个fire and forget async 方法,以记录用于审计目的。
我正在关注这个例子Async throw-away fire-and-forget with C#.NET。
public async Task MessageAsync(string message, DateTime date)
{
_logger.Info($"At {DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture)}: {message}");
await Task.Yield(); //NOT POSSIBLE IN .NET 4.0
}
但是我有使用.net framework 4.0的限制,我不能使用
await Task.Yield();
我知道这是确保方法异步执行的唯一方法,来自Microsoft:
你可以使用 await Task.Yield();在异步方法中强制 异步完成的方法。
我的问题是: .net 4.0 中此实现的替代方案是什么?
【问题讨论】:
-
但
Task.Yield只是为了举例(使其他同步方法“异步”),您在实际实现中不需要它。 -
我想(非常)确定这个方法是异步执行的,因为调用者的性能不应该受此影响。
-
那么也许只是将您的同步方法包装在
Task.Run中? -
Task MessageAsync(...) { return Task.Run(() => _logger.Info(...))}。我个人不会自己这样做,但我也不会使用Task.Yield。正确实现的记录器不会立即将日志写入磁盘\数据库,它会将它们放入内存队列并立即返回,同时在后台线程上处理它们。
标签: c# asynchronous task yield fire-and-forget