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

祖父

我手动构造一个任务:

var task = new Task(() => 
    Debug.WriteLine("Task"));

然后手动启动它:

task.Start(TaskScheduler.FromCurrentSynchronizationContext());

我希望可以通过预定SynchronizationContext.Post

但是如果以这种方式启动它:

task.RunSynchronously(TaskScheduler.FromCurrentSynchronizationContext());

它是通过SynchronizationContext.Send还是直接通过调用任务的lambda来执行

鼻塞

它是通过SynchronizationContext.Send执行还是直接通过调用任务的lambda执行?

这是怎么回事。首先,Task.RunSynchronously尝试通过调用执行任务scheduler.TryExecuteTaskInline如果使用SynchronizationContextTaskScheduler,则是这样的:

protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
    return ((SynchronizationContext.Current == this.m_synchronizationContext) && base.TryExecuteTask(task));
}

因此,如果在相同的同步上下文中,则任务lambda将直接在内部执行base.TryExecuteTask

否则,Task.RunSynchronously将任务与任务计划程序放在队列中,并WaitHandle通过阻止等待在任务上进行阻止。

SynchronizationContext.Send没有涉足任何情况。

有趣的是什么。AFAIK,在WPFDispatcherSynchronizationContext中,主UI线程上可能有多个上下文,每个顶级窗口一个。因此,从理论上讲,RunSynchronously可能会导致死锁。我将验证这一点。

更新后,WPF中的僵局是真实的这是复制方法:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.Loaded += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sMainWindow, RoutedEventArgs eMainWindow)
    {
        var task = new Task(() =>
            Debug.WriteLine("Task"));

        var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

        var window1 = new Window();
        window1.Loaded += (sWindow1, eWindow1) =>
        {
            // Deadlock in WPF
            task.RunSynchronously(scheduler);
            Debug.WriteLine("Done!");
        };
        window1.Show();
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Task.Factory.StartNew和同步上下文

来自分类Dev

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

来自分类Dev

关于上下文FLAG_ACTIVITY_NEW_TASK的错误

来自分类Dev

在Task内部等待之后的代码执行上下文

来自分类Dev

如何在Task.Delay的.net Framework 4和.net标准1.5之间切换上下文

来自分类Dev

使用Process.Start()和Windows Task Scheduler的异常

来自分类Dev

Task.ContinueWith是否捕获要继续的调用线程上下文?

来自分类Dev

Task.ContinueWith是否捕获要继续的调用线程上下文?

来自分类Dev

上下文需要FLAG_ACTIVITY_NEW_TASK标志,但是我已经设置了标志

来自分类Dev

传递给 Task.WaitAll() 的任务会在不同的上下文中运行吗?

来自分类Dev

在ibv_exp_post_send和ibv_exp_post_task的上下文中,生产者索引(PI)是什么?

来自分类Dev

{{url('/ task')}}和{{url()/ task}}之间的区别?

来自分类Dev

{{url('/ task')}}和{{url()/ task}}之间的区别?

来自分类Dev

Task.RunSynchronously()不在乎CancellationToken

来自分类Dev

Task.RunSynchronously()不在乎CancellationToken

来自分类Dev

Task.Run()是否与创建Task实例,然后与Start()相同?

来自分类Dev

new Thread(task).start() VS ThreadPoolExecutor.submit(task) in Android

来自分类Dev

我添加了FLAG_ACTIVITY_NEW_TASK标志,但仍然收到“活动上下文要求之外”错误

来自分类Dev

从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志异常-Android

来自分类Dev

从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是您想要的吗?

来自分类Dev

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

来自分类Dev

OpenMP Task和Taskwait构造

来自分类Dev

XMLstarlet和Windows Task操作

来自分类Dev

避免Task和Task <T>的重复方法

来自分类Dev

“ foreach with task.Wait”和Task.WaitAll之间的区别

来自分类Dev

“ foreach with task.Wait”和Task.WaitAll之间的区别

来自分类Dev

Task的TaskCompletionSource

来自分类Dev

Android中的新Thread(task).start()VS ThreadPoolExecutor.submit(task)

来自分类Dev

使用Task.Start触发任务时卡在Task.WaitAll(tasks.ToArray())

Related 相关文章

  1. 1

    Task.Factory.StartNew和同步上下文

  2. 2

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

  3. 3

    关于上下文FLAG_ACTIVITY_NEW_TASK的错误

  4. 4

    在Task内部等待之后的代码执行上下文

  5. 5

    如何在Task.Delay的.net Framework 4和.net标准1.5之间切换上下文

  6. 6

    使用Process.Start()和Windows Task Scheduler的异常

  7. 7

    Task.ContinueWith是否捕获要继续的调用线程上下文?

  8. 8

    Task.ContinueWith是否捕获要继续的调用线程上下文?

  9. 9

    上下文需要FLAG_ACTIVITY_NEW_TASK标志,但是我已经设置了标志

  10. 10

    传递给 Task.WaitAll() 的任务会在不同的上下文中运行吗?

  11. 11

    在ibv_exp_post_send和ibv_exp_post_task的上下文中,生产者索引(PI)是什么?

  12. 12

    {{url('/ task')}}和{{url()/ task}}之间的区别?

  13. 13

    {{url('/ task')}}和{{url()/ task}}之间的区别?

  14. 14

    Task.RunSynchronously()不在乎CancellationToken

  15. 15

    Task.RunSynchronously()不在乎CancellationToken

  16. 16

    Task.Run()是否与创建Task实例,然后与Start()相同?

  17. 17

    new Thread(task).start() VS ThreadPoolExecutor.submit(task) in Android

  18. 18

    我添加了FLAG_ACTIVITY_NEW_TASK标志,但仍然收到“活动上下文要求之外”错误

  19. 19

    从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志异常-Android

  20. 20

    从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志。这真的是您想要的吗?

  21. 21

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

  22. 22

    OpenMP Task和Taskwait构造

  23. 23

    XMLstarlet和Windows Task操作

  24. 24

    避免Task和Task <T>的重复方法

  25. 25

    “ foreach with task.Wait”和Task.WaitAll之间的区别

  26. 26

    “ foreach with task.Wait”和Task.WaitAll之间的区别

  27. 27

    Task的TaskCompletionSource

  28. 28

    Android中的新Thread(task).start()VS ThreadPoolExecutor.submit(task)

  29. 29

    使用Task.Start触发任务时卡在Task.WaitAll(tasks.ToArray())

热门标签

归档