【问题标题】:MVVM - long-running operation without async-awaitMVVM - 没有异步等待的长时间运行操作
【发布时间】:2014-11-18 16:38:42
【问题描述】:

我想开始长时间运行的操作,例如从 ViewModel 请求网页,并在我的 View 上执行一些进度更新操作。之前,我通过 awaiting 我的模型的 async 方法轻松实现了这一点,但在当前项目中,我受限于 .NET 4.0,因此无法使用 C#5 功能。

推荐的方法是什么?

【问题讨论】:

标签: c# asynchronous


【解决方案1】:

使用这个 -

Task.Factory.StartNew(() => 
{
   // Code to load web page or any code you want to run asynchronously
}).ContinueWith(task => 
{
   // Code you want to execute on completion of the above synchronous task,
}, UIHelper.GetUITaskScheduler());

其中 UIHelper 类具有以下静态方法 -

public class UIHelper
{
   /* Some other methods */

   public static TaskScheduler GetUITaskScheduler()
   {
      TaskScheduler scheduler = null;
      Application.Current.Dispatcher.Invoke(() =>
      {
         scheduler = TaskScheduler.FromCurrentSynchronizationContext();
      });
      return scheduler;
   }    
}

【讨论】:

  • 这样我无法更新我的视图控件。它们应该从 UI 的线程更新,并且 ViewModel 不能依赖于 UI 类
  • 通过 ui 调度器调用更新方法可以更新控件
  • 我可以,但这是肮脏的方式。 ViewModel 变得不可测试,你没有理由将它与 View 耦合
  • 您可以传入TaskScheduler.FromCurrentSynchronizationContext() 以使继续调度到UI 线程(当然假设您在UI 线程上获得了TaskScheduler。)
  • @astef INPC 绑定自动将事件调用编组到 UI 线程。不相信我?试试看。或者,您可以向 ViewModel 提供一个 Dispatcher,它在其上执行其代码。您可以在测试中提供此信息。这并不难。
【解决方案2】:

使用接收 https://rx.codeplex.com/

你也可以在 SyncronizationContext.Current 上观察

检查一下...

【讨论】:

    猜你喜欢
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2023-03-27
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多