Task.Factory.StartNew和同步上下文

祖父

一个简单的问题。这是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MaxDegreeOfParallelism与Task.Factory.StartNew()

来自分类Dev

Task.Factory.StartNew与新Task

来自分类Dev

Task.Start,Task.RunSynchronously和同步上下文

来自分类Dev

带参数和返回值的Task.Factory.StartNew

来自分类Dev

Task.Factory.StartNew and synchronization context

来自分类Dev

检查Task.Factory.StartNew何时完成?

来自分类Dev

Task.Factory.StartNew保证执行顺序

来自分类Dev

循环使用Task.Factory.StartNew

来自分类Dev

检查Task.Factory.StartNew何时完成?

来自分类Dev

循环使用Task.Factory.StartNew

来自分类Dev

Task.Factory.StartNew <T>和Task <T> .Factory.StartNew之间有什么区别吗?

来自分类Dev

Task.Factory.StartNew <T>和Task <T> .Factory.StartNew之间有什么区别吗?

来自分类Dev

Task.Run与Task.Factory.StartNew的返回类型

来自分类Dev

线程安全和Task.Factory

来自分类Dev

将参数传递到Task.Factory.StartNew

来自分类Dev

try / catch是否可以在Task.Factory.StartNew之外工作?

来自分类Dev

Task.Factory.StartNew传递返回值

来自分类Dev

使用Task.Factory.StartNew新建的线程启动非常缓慢

来自分类Dev

Web Api C#-Task.Factory.startnew与异步

来自分类Dev

有关Task.Factory.StartNew的基本问题

来自分类Dev

如何处理Task.Factory.StartNew异常?

来自分类Dev

使用Task.Factory.StartNew()然后返回值

来自分类Dev

没有ui freez的Task.Factory.StartNew延迟

来自分类Dev

UWP 中 System.Threading.Tasks.Task.Factory.StartNew() 的问题?

来自分类Dev

为 Task.Factory.StartNew() 传递迭代器的常量副本

来自分类Dev

Task.Factory.StartNew和new Thread()。Start()有什么区别?

来自分类Dev

Task.Factory.StartNew 执行和返回值赋值顺序

来自分类Dev

Task.Run与Task.Factory.StartNew-预期的死锁未发生

来自分类Dev

为什么不等待Task.Run()同步回UI线程/原始上下文?

Related 相关文章

  1. 1

    MaxDegreeOfParallelism与Task.Factory.StartNew()

  2. 2

    Task.Factory.StartNew与新Task

  3. 3

    Task.Start,Task.RunSynchronously和同步上下文

  4. 4

    带参数和返回值的Task.Factory.StartNew

  5. 5

    Task.Factory.StartNew and synchronization context

  6. 6

    检查Task.Factory.StartNew何时完成?

  7. 7

    Task.Factory.StartNew保证执行顺序

  8. 8

    循环使用Task.Factory.StartNew

  9. 9

    检查Task.Factory.StartNew何时完成?

  10. 10

    循环使用Task.Factory.StartNew

  11. 11

    Task.Factory.StartNew <T>和Task <T> .Factory.StartNew之间有什么区别吗?

  12. 12

    Task.Factory.StartNew <T>和Task <T> .Factory.StartNew之间有什么区别吗?

  13. 13

    Task.Run与Task.Factory.StartNew的返回类型

  14. 14

    线程安全和Task.Factory

  15. 15

    将参数传递到Task.Factory.StartNew

  16. 16

    try / catch是否可以在Task.Factory.StartNew之外工作?

  17. 17

    Task.Factory.StartNew传递返回值

  18. 18

    使用Task.Factory.StartNew新建的线程启动非常缓慢

  19. 19

    Web Api C#-Task.Factory.startnew与异步

  20. 20

    有关Task.Factory.StartNew的基本问题

  21. 21

    如何处理Task.Factory.StartNew异常?

  22. 22

    使用Task.Factory.StartNew()然后返回值

  23. 23

    没有ui freez的Task.Factory.StartNew延迟

  24. 24

    UWP 中 System.Threading.Tasks.Task.Factory.StartNew() 的问题?

  25. 25

    为 Task.Factory.StartNew() 传递迭代器的常量副本

  26. 26

    Task.Factory.StartNew和new Thread()。Start()有什么区别?

  27. 27

    Task.Factory.StartNew 执行和返回值赋值顺序

  28. 28

    Task.Run与Task.Factory.StartNew-预期的死锁未发生

  29. 29

    为什么不等待Task.Run()同步回UI线程/原始上下文?

热门标签

归档