c# - 使用 Task.Run 旋转的线程总是以退出代码 259 退出

标签 c# wpf multithreading task-parallel-library

<分区>

作为一个简单的例子,我有一个 WPF 应用程序,在主窗口上有一个按钮,因此代码如下:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    async void Button_Click(object sender, RoutedEventArgs e)
    {
        await Task<bool>.Run(() => this.DoOnThread());
    }

    async Task<bool> DoOnThread()
    {
        Thread.CurrentThread.Name = "MyTestThread";
        Thread.Sleep(1000);
        return true;
    }
}

如果我通过 VisualStudio 线程窗口在“return true”处中断,我可以获得 ThreadID,如果我继续并让代码运行完成并稍等直到线程退出,我会得到“线程 0x9ad34 已退出代码259 (0x103)”显示在VS输出窗口中。

我哪里做错了,我如何确保线程退出代码为 0?

最佳答案

Task.Run 创建线程。它安排一个委托(delegate)在 ThreadPool 线程上运行。线程池中的线程根据 CPU 负载创建或销毁。

您看到的退出代码与您的代码没有任何关系:它可能只是一条 Visual Studio 调试消息,或者一个退出的 ThreadPool 线程。

此外,async 并不意味着方法将异步运行。它是一种语法糖,允许编译器创建代码以异步等待任何标记为 await 的异步方法。在您的情况下,DoOnThread 没有异步调用或 await,因此它将同步运行。

事实上,编译器甚至会发出警告,指出 DoOnThread 不包含 await,因此它会同步运行

关于c# - 使用 Task.Run 旋转的线程总是以退出代码 259 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21632584/

相关文章:

c# - C#.NET 是否有类似于我的分配助手类?

c# - NHibernate:非法尝试将集合与两个打开的 session 关联

c# - Canvas.AddLogicalChild、Canvas.AddPhysicalChild,Canvas 的这个添加与 Canvas.Children.Add 有何不同?

python - 在Python中同时对URL发出多个POST请求

java - 如何在 Java 中正确实现玻璃面板?

c# - 如何在没有查询部分的情况下获取基本文件名?

c# - 从枚举列表生成 Linq 或子句

wpf - 为什么 "Setting event handlers inside a Setter.Value structure"会给出编译错误?

wpf - (WPF) 动画 ListView 项目移动

java - 多线程http客户端和tomcat 7