如何在WPF中处理长时间运行的“线程”?

晚上好!

目前我正在为一些rest服务开发一个wpf-client。 与rest服务的通信是没有问题的,并且是在额外的组装(通信接口)中完成的。

基本上:
我有一个“搜索”按钮执行一个方法。 这个方法与服务进行通信,更新一些文本框和进度条(给用户一些图形信息,我们到底有多远……)。 不幸的是,托管服务的服务器有点蹩脚,导致一些严重的响应时间(大约4秒)。 另一方面,这导致我的wpf应用程序等待,最终结果是:变黑,并且标题为“没有响应”……

我已经尝试将此执行放在另一个线程中,但是……我不会获得对wpf窗口控件的任何访问权限……这是合乎逻辑的…

atm我真的很无奈……任何人都可以给我一些handeling例程或解决方案吗?

该video演示了如何使用WPF和Dispatcher.BeginInvoke方法创建异步进度条。 这是对WPF中基本交叉线程问题的简单解决方案的一个很好的温和介绍。

您的UI线程正忙于等待来自Web服务的响应,并且无法绘制屏幕。 一个不错的选择是将服务请求推送到另一个非UI线程。 查看BackgroundWorker ,它专门设计用于简化这一过程。 它处理从非UI到UI线程的跨线程调用的编组。

大致:

BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); bw.RunWorkerAsync(arg); ... static void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; int arg = (int)e.Argument; e.Result = CallWebService(arg, e); } static void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Increment(); } static void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { label.Text = "Done: " + e.Result.ToString(); } 

要从第二个线程访问您的控件,请使用Dispatcher.BeginInvoke:

 Dispatcher.BeginInvoke(new Action(() => { // Update your controls here. }), null); 

或者您可以查看使用BackgroundWorker 。