【问题标题】:c# fire and forget async method: implement yield() in .net 4c# 触发并忘记异步方法:在 .net 4 中实现 yield()
【发布时间】: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


【解决方案1】:

根据@Evk 消息,我已经尝试过:

Task MessageAsync(string message, DateTime date, CancellationToken token)
{
   var messageToLog =$"At {date.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture)}: {message}";
   Task.Factory.StartNew(() => _logger.Info(messageToLog), token);
}

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多