C# MVVM—无异步等待的长时间运行操作
我想启动长时间运行的操作,比如从ViewModel请求网页,并在我的视图上执行一些进度更新操作。以前,我通过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
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提供一个调度程序,在该调度程序上执行代码。您可以在测试中提供这一点。这并不难做到。