Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程使用模式(.net wpf)_C#_Wpf_Multithreading - Fatal编程技术网

C# 线程使用模式(.net wpf)

C# 线程使用模式(.net wpf),c#,wpf,multithreading,C#,Wpf,Multithreading,我很难理解如何使用线程。在根据需要调用委托以允许用户从项目集合中进行选择的情况下,由于数据检索,第一次实例化的成本很高。方法如下所示: private void _doStandAloneProjectPickSession(ProjectDataMode dataMode) { var picker = new ProjectPicker(); var svc = _getFilterService(dataMode); ===> this is time consuming

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

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

您的基本想法是正确的:在后台线程上执行耗时的工作,并仅在必要时(即当您更新UI组件时)才重新连接到UI线程。但是,我建议您只需使用该组件即可简化您的生活。它会为您同步回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();

您的基本想法是正确的:在后台线程上执行耗时的工作,并仅在必要时(即当您更新UI组件时)才重新连接到UI线程。但是,我建议您只需使用该组件即可简化您的生活。它会为您同步回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();

请你把这个写得更清楚一点好吗?我不太清楚你想做什么,使用wpf调度程序很容易,给一个委托和负载执行一个任务也很容易,把它放在一起也应该很容易,但我仍然不清楚你在做什么。请你把这个写得更清楚一点好吗?我不太清楚当然你想做什么,使用wpf调度程序很容易,给一个委托和有效负载处理一个任务也很容易,把它放在一起也应该很容易,但我仍然不清楚你在做什么。哇,进度变了,运行工人完成的委托在调用线程上运行?@firoso:的确如此。这就是问题的关键组件。它使用当前SynchronizationContext将这些事件处理程序的执行封送到UI线程。
BackgroundWorker
非常好地简化了整个问题。对同步上下文有何想法()?或者关于BackgroundWorker和TDD的想法?我通常在测试它之前不会完全得到一些东西,但它看起来确实是一个升级,而不是手动调度调用。谢谢!哇,进度发生了变化,运行工人完成的委托在调用线程上运行?@firoso:确实如此。这就是组件的要点。它使用当前的SynchronizationContext将这些事件处理程序的执行封送到UI线程。
BackgroundWorker
非常好地简化了整个问题。关于同步上下文的任何想法()?或者关于BackgroundWorker和TDD的想法?我通常在能够测试它之前不会完全得到一些东西,但它看起来确实是一个升级,而不是手动调度调用。谢谢!