具有异步/等待的System.Threading.Timer陷入重复

时间:2015-04-12 15:25:32

标签: c# asynchronous timer

我想安排一个每分钟执行的功能。此方法调用异步函数,该函数是HttpWebRequest。我正在使用async / await策略:

var timer = new System.Threading.Timer(async (e) =>
{
    RSSClient rss = new RSSClient(listBoxRSS);
    RSSNotification n = await rss.fetch();
    // ...
    Console.WriteLine("Tick");
}, null, 0, 5000);

控制台打印" Tick",但只打印一次。似乎计时器因某种原因而卡住了。

删除async / await代码后,计时器工作正常:

var timer = new System.Threading.Timer((e) =>
{
    Console.WriteLine("Tick");
}, null, 0, 5000);

为什么不重复,如何使用System.Threading.Timer实现async / await策略?

1 个答案:

答案 0 :(得分:9)

正如Darin Dimitrov所指出的,异步方法中有一个异常,由于某种原因,它没有在调试器中显示,但可以使用try / catch捕获。

使用async / await的以下代码可以正常工作:

var timer = new System.Threading.Timer(async (e) =>
{
    await Task.Delay(500);
    Console.WriteLine("Tick");
}, null, 0, 5000);