一个简单的问题。这是WinForms应用程序的一部分:
void Form1_Load(object sender, EventArgs e)
{
var task2 = Task.Factory.StartNew(() => MessageBox.Show("Task!"),
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext());
Debug.WriteLine("Before Exit");
MessageBox.Show("Exit!");
}
有人可以解释为什么我看到“任务!” 首先,然后在运行此命令时“退出”?
当我看到“任务”!消息框,“退出之前”已经打印在调试输出中。
编辑:更简单,相同的效果:
void Form1_Load(object sender, EventArgs e)
{
SynchronizationContext.Current.Post((_) =>
MessageBox.Show("Task!"), null);
Debug.WriteLine("Before Exit");
MessageBox.Show("Exit!");
}
编辑:如果我替换MessageBox.Show("Exit!")
为Form { Text = "Exit!" }.ShowDialog()
,则按预期看到“退出”,然后是“任务”。这是为什么?
.NET框架中Win32消息泵送的确切详细信息尚未记录。请注意,Win32 API历史上具有允许的重入行为。
当您的代码启动任务时,正在使用的任务计划程序将要求任务在current上执行SynchronizationContext
。因此它最终调用SynchronizationContext.Current.Post
,非常类似于您的第二个代码示例。
该WindowsFormsSynchronizationContext
作品由发布一个Win32消息到消息队列; 消息类型是.NET在内部定义的一种,表示“执行此代码”。(这些详细信息未记录)。
当您的代码继续调用时MessageBox.Show
,它将运行一个嵌套的消息循环,这就是排队的操作正在执行的原因。如果您删除了Exit!
消息框,那么将在Form1_Load
返回到顶级消息循环后执行操作Application.Run
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句