System.Threading.Timer与async/await结合时重复执行卡住了

13

我想要安排一个函数每分钟执行一次。这个方法调用了一个异步函数,它是一个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”,似乎计时器由于某种原因停止了。

但是,移除异步/等待代码后,计时器就可以正常工作:

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

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


2
你尝试在计时器代码中加入 try/catch 吗?也许它在后续调用中会抛出异常。 - Darin Dimitrov
1个回答

19

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接