【问题标题】:Difference between Dispatcher and TaskSchdulerDispatcher 和 TaskSchduler 的区别
【发布时间】:2014-08-14 22:20:51
【问题描述】:

在 WPF 中,Dispatcher 和 taskscheduler 都有助于将值从后台线程传递到 UI 线程。所以他们之间真的有什么区别。 例如在下面的代码中,选项 1 和选项 2 之间的实际区别是什么

        Task<int> tsk = Task<int>.Factory.StartNew(TestMethod);
        var threadSchedulder = TaskScheduler.FromCurrentSynchronizationContext();

        //Option 1
        tsk.ContinueWith((t) =>
            {
                SetText(tsk.Result);
            }, threadSchedulder);

        //Option 2
        this.Dispatcher.Invoke(() =>
        {
            SetText(tsk.Result);
        });

【问题讨论】:

  • Task&lt;int&gt; tsk = Task&lt;int&gt;.Factory... - 老兄,请使用var,C#不是java。
  • 他们没有共同点。 TaskScheduler.FromSynchronizationContext() 知道如何使用 SynchronizationContext.Current,它知道如何使用 Dispatcher.BeginInvoke() 让任务在 WPF 应用程序的 UI 线程上运行。使用 TaskScheduler 的优势在于,当您的代码不在 WPF 应用程序中运行时,它仍然可以工作。缺点是当你不在 UI 线程上创建 Task 时它将无法完成它的工作。
  • @HansPassant 在实际意义上(从 OP 的“消费者”代码)的角度来看,它们几乎相同..
  • 在 wpf 中,使用 dispatcher 更清楚你的意图,因为这是推荐的方式

标签: wpf c#-5.0


【解决方案1】:

两者的作用几乎相同,并且各有优势。

Dispatcher.BeginInvoke() : 仅更新 UI 线程上的内容 Dispatcher.BeginInvoke 是最佳选择。通常这样做是为了使用在后台线程上执行的某些操作的结果来更新某些 UI 控件。 Dispatcher.Invoke 调用将阻塞,直到此操作完成。我们不应该在这里执行冗长的操作。

Dispatcher.BeginInvoke( () =>{myLabel.Text = "myText"});

Task.Factory.StartNew() : 将多个任务组合在一起时很有用。这使得依赖于先前任务的调度工作变得更加简单,因为您可以使用 Task.WaitAll/Task.WaitAny 以及延续。

【讨论】:

  • 问题是taskscheduler vs dispatcher
猜你喜欢
  • 2021-09-20
  • 1970-01-01
  • 2020-03-21
  • 2012-07-26
  • 2012-11-04
  • 1970-01-01
  • 2020-01-17
  • 2017-09-19
  • 1970-01-01
相关资源
最近更新 更多