使用Task.Run旋转的线程始终以退出代码259退出

时间:2014-02-07 16:13:07

标签: 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线程窗口中断“返回true”我可以获得ThreadID,如果我继续并让代码运行完成并等待一段时间直到线程退出,我得到“线程0x9ad34已退出代码259(0x103)“显示在VS输出窗口中。

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

2 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分:9)

线程池线程不属于您。您不应该设置他们的Name,也不应该关注他们的退出代码。