使ElapsedEventHandler方法异步有没有任何好处?

时间:2017-03-24 03:06:05

标签: c# .net multithreading asynchronous async-await

举一个简单的例子,假设我的事件是命中数据库的东西。

SystemTimer Ticker = new SystemTimer() { Interval = TimeSpan.FromSeconds(5).TotalMilliseconds, AutoReset = true };
Ticker.Elapsed += HitTheDatabase;

让我们说HitTheDatabaseasync void,并以await connection.OpenAsync();等方式利用等待性。如果只是制作方法void并让它connection.Open();,那么这会有什么好处吗?

我的理解是已逝去的事件

  • 是“一见不醒”(这对我的应用程序的需求来说很好)
  • 在与上次调用时不同的线程中运行事件,如果

这是对的吗?或者有人可以用图表来解释它吗?

就像我有

Ticker.Interval = 1000; 
Ticket.Elapsed += Wait2Seconds;

private static void Wait2Seconds(object source, ElapsedEventArgs e)
{
     Thread.Sleep(2000);
}

就像

Time     |  0:01   |    0:02    |   0:03   |    0:04   |
-----------------------------------------------------------
Thread 1 | |-------waiting------|
Thread 2 |         |-------waiting------|
Thread 3 |                       |-------waiting------|   
Thread 4 |                                 |-------waiting------|

使用async的{​​{1}}版本会有什么不同吗?

1 个答案:

答案 0 :(得分:0)

这种好处将来自与数据库交互的自然异步性质。如果您编写代码以同步访问数据库,则在等待数据库响应时将阻塞线程。异步调用将释放您打到数据库的线程,直到它响应。这适用于任何命中数据库而不是特定于计时器的内容。有关更多信息,请查看benefits of asyc Db access