我无法理解如何使用线程。在根据需要调用以允许用户从项目集合中进行选择的委托中,由于数据检索,第一个实例化成本很高。方法如下:
private void _doStandAloneProjectPickSession(ProjectDataMode dataMode) {
var picker = new ProjectPicker();
var svc = _getFilterService(dataMode); ===> this is time consuming**
_vm = new ProjectSelectionViewModel(picker, svc);
_vm.RequestClose += _onClosing;
_window = picker;
_window.ShowDialog();
}
基本的想法是在它自己的线程中启动长时间运行的进程(即新的线程(doSomething)。启动然后使用Dispatcher(在wpf应用程序中)在进程发生时切入?我想做像下面的伪代码,但我不能让它工作。
private void _doStandAloneProjectPickSession(ProjectDataMode dataMode) {
...
// let user know the system is fetching data
// _getDispatcher.BeginInvoke(DispatcherPriority.Background, ()=>SetStaus("Fetching data...");
IProjectFilterService svc = null;
// fetch the data
// new Thread(_getFilterService(dataMode)).Start();
_vm = new ProjectSelectionViewModel(picker, svc);
_vm.RequestClose += _onClosing;
...
}
有人可以告诉我工作代码的样子吗?
干杯,
Berryl
答案 0 :(得分:3)
您的基本想法是正确的:在后台线程上执行耗时的工作,并且仅在必要时(即,当您更新UI组件时)联接回UI线程。但是,我建议您只使用BackgroundWorker
组件来简化生活。它为您重新同步回UI线程:
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += delegate
{
//do expensive work here, optionally calling ReportProgress to report progress
};
backgroundWorker.ProgressChanged += delegate
{
//update the UI. eg. a ProgressBar
};
backgroundWorker.RunWorkerCompleted += delegate
{
//all done - update the UI with the results
};
//kick it off!
backgroundWorker.RunWorkerAsync();