使用Task.Run创建的线程总是以退出代码259退出

5
作为一个简单的例子,我有一个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;
    }
}

如果我在"return true"处通过VisualStudio线程窗口进行中断,我可以获取ThreadID;如果我继续运行代码并等待一段时间直到线程退出,我会在VS输出窗口显示"The thread 0x9ad34 has exited with code 259 (0x103)"。 我做错了什么,如何确保我得到一个退出代码为0的线程?

1
退出代码259是“STILL_ACTIVE”。我不确定你在这里想要实现什么。 - Adam Sears
3
同意亚当的观点……你想要做什么?任务在线程池上运行,这些线程保持活动状态并等待工作。 - J...
只是我看到了这些退出代码是在Visual Studio输出中,想知道是什么原因导致的。我上面给出的简单、粗糙的例子只是为了得到一个答案,没有别的意思。谢谢。 - John
2
提示:右击并取消选择模块/线程/进程消息。它们几乎总是噪音。 - Stephen Cleary
2个回答

15

Task.Run不创建线程,它会在ThreadPool线程上调度委托运行。ThreadPool中的线程根据CPU负载来创建或销毁。

您看到的退出代码实际上与您的代码无关:它可能只是Visual Studio调试消息或已退出的ThreadPool线程。

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

实际上,编译器甚至会发出警告,DoOnThread不包含await,所以它将同步运行。


1
它调度一个委托,该委托可能是lambda也可能不是。 - Servy
1
谢谢,Task.Run会导致操作在与UI线程不同的线程上执行。我通过检查按钮单击和DoOnthread方法的托管线程ID来验证了这一点。我只是担心退出代码259是一个问题,但似乎我应该忽略它。 - John

9

线程池线程不属于你。你不应该设置它们的 Name,也不应该关心它们的退出代码。


是的,谢谢。我只是为了这个简单的测试方便识别它而给它命名。不过你说得对。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接