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

标签 c# .net thread-safety

我目前正在开发一个旧版 .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/

相关文章:

c# - 无法从 Web API 中的删除方法获取参数

c# - 通过匿名类型更新数据库?

c# - 为什么 Equals 和 ReferenceEquals 方法的结果不同,即使变量是引用类型?

c# - 自更新 WPF 应用程序的库

java - 如何更新 ConcurrentHashMap 线程安全中的值

c# - 如何在 C# 中实现线程安全的无错误事件处理程序?

java - 同步对 Volatile 字段的写入访问(廉价读写 block )

c# - 为什么在安装 Visual Studio 2008 后,catch(TException) 处理 block 行为在调试器下有所不同?

c# - 仅编写静态方法是否等同于 C# 中的无副作用编程?

c# - Microsoft SqlServer 管理 : method not found creating a ServerConnection