C# 在图形用户界面(如Windows窗体、WPF)中,哪个线程运行代码?

C# 在图形用户界面(如Windows窗体、WPF)中,哪个线程运行代码?,c#,.net,C#,.net,我知道只有GUI线程可以更新UI组件,为了计算长时间运行的任务,我们必须使用线程池来完成艰苦的工作,并使用同步上下文任务调度器创建一个延续任务来更新UI 下面是一个简单的Windows窗体应用程序 内部密封类MyForm:Form { 专用只读任务调度器m_syncContextTaskScheduler; 公共MyForm() { m_syncContextTaskScheduler= TaskScheduler.FromCurrentSynchronizationContext(); Tex

我知道只有GUI线程可以更新UI组件,为了计算长时间运行的任务,我们必须使用线程池来完成艰苦的工作,并使用同步上下文任务调度器创建一个延续任务来更新UI

下面是一个简单的Windows窗体应用程序

内部密封类MyForm:Form
{
专用只读任务调度器m_syncContextTaskScheduler;
公共MyForm()
{
m_syncContextTaskScheduler=
TaskScheduler.FromCurrentSynchronizationContext();
Text=“同步上下文任务调度程序演示”;
}
鼠标单击时受保护的覆盖无效(鼠标目标e)
{
//此任务使用默认任务计划程序,并在线程池线程上执行
Task t=Task.Run(…);
//此任务使用同步上下文任务调度程序,并在GUI线程上执行
t、 继续(task=>Text=“Result:+task.Result,
取消令牌。无,
TaskContinuationOptions.OnlyOnRanToCompletion,
m_syncContextTaskScheduler);
...
base.OnMouseClick(e);
}
}

我的问题很简单,哪个线程运行后面的代码,比如
OnMouseClick
方法?是GUI线程本身在后面执行此代码,所以只涉及两个线程,一个GUI线程和一个工作线程?或者一个工作线程在后面运行此代码,因此涉及一个GUI线程和两个工作线程?

UI生成事件的处理程序在UI线程中执行。因此,在您的代码中,OnMouseClick的
也将在UI线程中执行。
任务
将在调度程序定义的线程上执行(通常是线程池的线程)

从技术上讲,一些代码可以在非UI线程中调用您的
OnMouseClick
,但这是一种不好的做法,标准WinForms/WPF控件不会做这种事情


另外请注意,线程池通常有多个线程用于任务。

我在我的简单WPF应用程序上做了一个简单的测试,在MainWindow()和btnMouseClick()中,我打印了线程id
{System.Threading.thread.CurrentThread.ManagedThreadId}
正如你所能想象的,两个都是1。因此,是的,GUI线程正在您的
OnMouseClick
中执行代码,那么您的新任务就在工作线程上