延迟方法中非关键操作的推荐方法是什么?

时间:2016-05-02 09:17:58

标签: .net performance

我有以下代码:

public int Get5() {
   // Not critical for presentation operation
   LoggingService.Log();

   // Retrieve data. The data calculation operation is lightweight operation.
   return 5;
}

从代码中可以看出,该方法大部分时间都是用于记录。由于此操作并不重要,我希望尽快延迟并返回数据。

备注:

  • 我可以使用Task.Run(),但这会引入更改方法上下文的开销。
  • 我可以使用yeild return但我必须更改方法签名。
  • 我可以使用消息队列机制,但这绝对是一种矫枉过正的行为。

那么推荐的方法是什么?它是否值得呢?

2 个答案:

答案 0 :(得分:0)

您可以使用非关键操作的方法,并使用async和await将其传递给工作线程。这将使主线程将操作委托给工作线程。一旦遇到await,操作就被委托给工作线程,并且工作线程将处理该方法的其余部分。

public async int Get5(){    //关键操作    等待    //任何非关键操作 }

答案 1 :(得分:0)

我认为最简单的方法是获取支持它的日志框架。例如。 NLog有一个async wrapper,这是一个很棒的日志框架。

记录通常发生得非常快,并且可能在某些实时应用程序中避免使用(例如交换源或某些硬件)。否则就像在普通的Web应用程序中一样,它根本不重要,你应该尝试优化系统的其他部分,然后才能达到如此低的水平。如果我们以Web请求/响应为例,那么通过网络发送数据将会非常慢,因此通过优化日志记录,您将获得可能低于1%的增长,这是不明显的。

P.S。在我的整个职业生涯中,我从来没有需要以这种方式优化伐木,所以我认为除非你真的需要它,否则不值得花时间。