While (true)循环在Task中静默退出

本文关键字:Task 静默 退出 循环 true While | 更新日期: 2023-09-27 18:18:21

我制作了一个聊天机器人应用程序,它遍历所有收到的消息,并以指定的间隔(~1秒)响应它们。负责的代码部分如下所示:

Task.Factory.StartNew(() => DoWork());
void DoWork()
{
    try {
        while (true) 
        {
            ProcessMessages();
            Thread.Sleep(sleepInterval);
        }
    }
    catch(Exception ex) {Log(ex + "");}
}

问题是这个循环有时退出时没有显示任何消息,或者没有抛出异常并记录。我在某个地方读到Thread.Sleep()可能是问题,因为系统可能认为任务无响应并试图终止它,所以它应该更改为EventWaitHandle并执行waitHandle.WaitOne(sleepInterval),但它没有帮助我。

我正在调试上运行应用程序,当我看到应用程序不做工作时,我在循环内设置了一个断点,visual studio不会暂停。处理任务中的计时器显示它们有一段时间没有更新了。"infinite"循环就这样无声地结束了。

这是一个winforms应用程序,我注意到有时它们在调试模式下运行时不会自动中断,即使抛出异常。但我只知道这发生在一个异常在某个地方由一个控件的方法调用的代码。这是一个Task然而,所以我不知道它是否应该以同样的方式工作。

处理方法内部的代码可能会抛出异常,但是为什么即使调用是在try-catch子句中,它们也不会被记录?什么会使循环突然结束?如何让我的应用更可靠?

While (true)循环在Task中静默退出

我不相信Thread.Sleep在无限循环和内部任务。你至少应该使用一个合适的计时器。

要做这种事情,我会使用微软的响应式框架(称为"Rx")。

代码如下:

var subscription =
    Observable
        .Interval(TimeSpan.FromSeconds(1.0))
        .Subscribe(n =>
        {
            ProcessMessages();
        });

基本上它会设置一个计时器来处理你的消息。

如果你想让它停止,就按subscription.Dispose()

你可以NuGet "Rx-Main"来获取位