【问题标题】:System.Threading.Timer with async/await stuck in repeatSystem.Threading.Timer 与 async/await 重复卡住
【发布时间】:2015-04-12 23:38:00
【问题描述】:

我想安排一个函数每分钟执行一次。此方法调用一个异步函数,即 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 实现异步/等待策略?

【问题讨论】:

  • 您是否尝试将try/catch 放入您的计时器代码中?也许它会在后续调用中引发异常。

标签: c# asynchronous timer


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2018-10-18
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多