线程使用模式(.net wpf)

时间:2009-10-15 15:39:13

标签: c# wpf multithreading

我无法理解如何使用线程。在根据需要调用以允许用户从项目集合中进行选择的委托中,由于数据检索,第一个实例化成本很高。方法如下:

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

1 个答案:

答案 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();