使用Task.Run旋转的线程始终以退出代码259退出
作为一个简单的例子,我有一个WPF应用程序,主窗口上有一个按钮,因此代码背后:
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } async void Button_Click(object sender, RoutedEventArgs e) { await Task.Run(() => this.DoOnThread()); } async Task DoOnThread() { Thread.CurrentThread.Name = "MyTestThread"; Thread.Sleep(1000); return true; } }
如果我通过VisualStudio线程窗口中断“返回true”我可以获得ThreadID,如果我继续并让代码运行完成并等待一段时间直到线程退出,我得到“线程0x9ad34已经退出代码259(0x103) )“显示在VS输出窗口中。
我做错了什么,如何确保线程退出代码为0?
Task.Run不会创建线程。 它安排委托在ThreadPool线程上运行。 根据CPU负载创建或销毁线程池中的线程。
您看到的退出代码与您的代码没有任何关系:它可能只是一个Visual Studio调试消息,或退出的ThreadPool线程。
此外, async
并不意味着方法将异步运行。 它是语法糖,允许编译器创建代码以异步等待任何标记为await
异步方法。 在您的情况下, DoOnThread
没有异步调用或await
因此它将同步运行。
实际上,编译器甚至会发出DoOnThread
不包含await
的警告,因此它将同步运行
线程池线程不属于您。 您不应该设置他们的Name
,也不应该关注他们的退出代码。