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的想法?我通常在能够测试它之前不会完全得到一些东西,但它看起来确实是一个升级,而不是手动调度调用。谢谢!