Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM—无异步等待的长时间运行操作_C#_Asynchronous - Fatal编程技术网

C# MVVM—无异步等待的长时间运行操作

C# MVVM—无异步等待的长时间运行操作,c#,asynchronous,C#,Asynchronous,我想启动长时间运行的操作,比如从ViewModel请求网页,并在我的视图上执行一些进度更新操作。以前,我通过waiting我的模型的async方法很容易做到这一点,但在当前的项目中,我受到.NET4.0的限制,所以我不能使用C#5特性 推荐的方法是什么?使用此方法- Task.Factory.StartNew(() => { // Code to load web page or any code you want to run asynchronously }).Continue

我想启动长时间运行的操作,比如从ViewModel请求网页,并在我的视图上执行一些进度更新操作。以前,我通过
wait
ing我的模型的
async
方法很容易做到这一点,但在当前的项目中,我受到.NET4.0的限制,所以我不能使用C#5特性

推荐的方法是什么?

使用此方法-

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;
   }    
}
使用RX

您还可以在SyncronizationContext.Current上观察


查看它们…

因此您必须处理线程问题。在简单的情况下,它相当容易使用。您不必更改代码@MotiAzu模型代码尚未编写,因此我建议使用另一种情况。这样,我就无法更新视图的控件。它们应该从UI的线程更新,ViewModel不能依赖于UI类如果通过UI dispatcherI调用更新方法,则可以更新控件,但这是一种肮脏的方式。ViewModel变得不稳定,您没有理由将其从ViewModel中进行文档耦合。您可以传入以使延续分派到UI线程(当然,假设您在UI线程上获得TaskScheduler)。@astef INPC bindings会自动将事件调用封送到UI线程。不相信我?试试看。或者,您可以向ViewModel提供一个调度程序,在该调度程序上执行代码。您可以在测试中提供这一点。这并不难做到。