我是WPF的初学者,在我的应用程序中,我需要执行一系列初始化步骤,这些步骤需要7-8秒才能完成,在此期间我的UI变得无法响应.为了解决这个问题,我在一个单独的线程中执行初始化:
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了一些文章BackgroundWorker,关于它应该如何允许我保持我的应用程序响应,而不必编写一个线程来执行冗长的任务,但我没有成功地尝试实现它,任何人都可以告诉我怎么做这个使用BackgroundWorker?
谢谢,Eamonn
什么是在WPF和MVVM上实现异步操作的最简单方法,让我们说如果用户在某个字段上输入时我想要启动命令然后返回,而线程将执行一些搜索操作然后返回更新属性,以便通知可以更新绑定.
谢谢!
这个senerio有效吗?
我有一个View来维护一个Item.
我有View Model,它将Item对象(实现INotifyPropertyChanged)公开为View绑定的Property.
将Item对象传递给修改它的Backgroundworker是否有效,然后在BackgroundWorking完成时引发PropertyChanged事件?
或者BackgroundWorker不应该修改Item对象.我将使用BackgroundWorker传回的结果更新现有的Item对象.这将在RunWorkerCompleted事件中完成.但这会锁定UI线程并击败拥有背景工作者的对象吗?
困惑?
我会试着解释一下.
用户可以选择创建项目.我创建了视图和视图模型.在View模型中,创建一个空Item对象.他被提供了一个视图来维护项目.在选择"项类型"属性时,这会启动一个复杂的过程来创建用户输入的权限列表.我可以在创建列表时阻止UI线程,但这会给用户带来糟糕的体验.我想将处理传递给后台线程,同时保持UI活着.目前,我设置了一个标志来指示View正在加载的部分,将Item对象传递给BackgroundWorker,后者更新了可观察的Properties集合.当BackgroundWorking完成后,我调用PropertyChanged事件,该事件更新绑定到列表的View部分,并关闭该标志以指示该部分正在加载.这似乎没有任何问题.但我有一种直觉,我不应该在后台线程中更新视图模型中的绑定项.
谢谢蒂姆
是否有任何标准工具或推荐的异步任务执行方法?
UPD我明白了,如何使用线程.我只需要知道在执行异步调用时阻止UI的推荐WPF方式,以及如何更新进度信息.