.NET 函数中的线程永远不会返回



我目前正在处理一个遗留的.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警告吗?

或者,我怎样才能改进我的编码?

多谢!!

编译器使用"Never returns"表示"Never Ends"。函数可以完全返回,尽管它的返回值是(非(类型的 void。

从字面上看,你输入的第一件事是一个无限循环。 第二件事是捕获所有异常的尝试块。当你以.NET Framework或OS为目标时,除了Thread.Abort((机制之外,没有什么能杀死它。

无限循环总是一个坏主意。通常循环检查故障条件。诸如"用户选择关闭应用程序,停止运行该事件队列"之类的内容。通常,循环结束是函数甚至整个应用程序的结束方式。EventQueue实际上使这些Windows Forms应用程序保持活力。

异常处理是我的烦恼,必须修复该捕获块。您还需要竭尽全力确保异常不会被线程意外吞噬。多线程以这种行为而闻名。我经常链接的母题上有两篇文章。捕获异常的唯一原因是确保在线程结束时或记录时保留此错误 - 然后抛出。

实际上,多线程代码可以使用其他代码可以设置的布尔值。如果必须采取进一步措施(如竞争条件预防(,它还取决于采取什么行动。

我建议使用WaitHandle。因为,while (true)会破坏 CPU 性能,它会尽可能多地占用 CPU 功率。Thread.Sleep(timeout)拒绝当前时间片的其余部分,但仍会导致高水平的 CPU 利用率。

若要避免无穷循环,请使用 EventWaitHandle:

var waitHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "0597f0b8-4472-4e60-b56f-bb44c4ded684", out var createdNew);
private void StartThread(Action action, int timeout, EventWaitHandle waitHandle)
{
new Thread(() =>
{
var signaled = false;
do
{
//Your code
// Wait until someone tells us to stop or do something else
signaled = waitHandle.WaitOne(TimeSpan.FromMilliseconds(timeout));
} while (!signaled);
})
{
IsBackground = true
}.Start();
}

最新更新