【问题标题】:thread usage pattern (.net wpf)线程使用模式 (.net wpf)
【发布时间】:2009-10-15 15:39:13
【问题描述】:

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

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();
  }

在它自己的线程中启动长时间运行的进程的基本想法是(即 new Thread(doSomething).Start 然后使用 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;

   ...
  }

谁能告诉我工作代码可能是什么样子?

干杯,
浆果

【问题讨论】:

  • 你能把这个重新写得更清楚一点吗?我不太确定您要做什么,使用 wpf 调度程序很容易,并且给定委托和有效负载的任务线程很容易,将它们放在一起也应该很容易,但我仍然不清楚你在做什么。

标签: c# wpf multithreading


【解决方案1】:

您的基本想法是正确的:在后台线程上进行耗时的工作,并仅在必要时(即,当您更新 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();

【讨论】:

  • 哇,进度改变了,运行工人完成的委托在调用线程上运行?
  • @firoso:确实如此。这就是组件的重点。它使用当前的 SynchronizationContext 将这些事件处理程序的执行编组到 UI 线程。
  • BackgroundWorker 非常好地简化了整个问题。
  • 关于同步上下文 (msdn.microsoft.com/en-us/library/…) 的任何想法?或者对 BackgroundWorker 和 TDD 的想法?在我可以测试之前,我通常不会完全得到一些东西,但它确实似乎是对手动调度程序调用的升级。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2014-10-06
相关资源
最近更新 更多