我目前正在开发一个旧版 .NET 4.7 项目。我正在调用一个方法,该方法用无限 while 循环启动一个线程。 ReSharper 指出,我的问题是“函数永远不会返回”。
程序逻辑工作正常,目前还没有出现任何错误。
代码如下所示:
private void StartThread(Action action, int timeout)
{
new Thread(() =>
{
while (true)
{
try
{
action();
}
catch (Exception ex)
{
log.Warn($"Exception sending {action.Method.Name}.", ex);
}
Thread.Sleep(timeout);
}
}) // ReSharper indicates here, that the function never returns, though it's void...
{
Name = $"TestThread1",
IsBackground = true
}.Start();
}
您认为代码实际上工作正常吗?我应该忘记 ReSharper 警告吗?
或者,我如何改进我的编码?
非常感谢!!
最佳答案
“永不返回”,编译器意味着“永不结束”。函数可以完全返回,尽管它的返回值是(非)类型 void。
实际上,您放入的第一件事是无限循环。 第二件事是捕获所有异常的 Try block 。当您以 .NET Framework 或操作系统为目标时,如果没有 Thread.Abort() 机制,没有什么可以解决这个问题。
无限循环总是一个坏主意。通常循环检查故障情况。诸如“用户选择关闭应用程序,停止运行该事件队列”之类的内容。通常,循环结束是函数甚至整个应用程序的结束方式。该 EventQueue 实际上使这些 Windows 窗体应用程序保持活力。
异常处理是我的一大烦恼,并且必须修复该 catch block 。您还需要尽力确保异常不会意外地被线程吞没。多线程因这种行为而闻名。有two articles关于我经常链接的问题。捕获异常的唯一原因是确保当线程结束或记录时此错误持续存在 - 然后抛出。
实际的多线程代码可以使用其他代码可以设置的 bool 值。它还取决于采取什么行动,是否必须采取进一步的措施(如竞争条件预防)。
关于c# - .NET 函数中的线程永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59375149/