C# “如何处理长时间跑步”;“线程”;在WPF中?
晚上好 目前,我正在为一些rest服务开发一个wpf客户端。与rest服务的通信没有问题,是在一个额外的程序集(通信接口)中完成的 基本上:C# “如何处理长时间跑步”;“线程”;在WPF中?,c#,.net,wpf,multithreading,C#,.net,Wpf,Multithreading,晚上好 目前,我正在为一些rest服务开发一个wpf客户端。与rest服务的通信没有问题,是在一个额外的程序集(通信接口)中完成的 基本上: 我有一个执行方法的“搜索”按钮。此方法与服务通信,更新一些文本框和进度条(为用户提供一些图形信息,我们有多远…)。 不幸的是,承载该服务的服务器有点蹩脚,导致了一些严重的响应时间(大约4秒)。另一方面,这会导致我的wpf应用程序等待,结果是:变黑,并且滴度“没有响应” 我已经尝试将此执行放在另一个线程中,但是。。。这是合乎逻辑的,我不会获得任何访问我的wp
我有一个执行方法的“搜索”按钮。此方法与服务通信,更新一些文本框和进度条(为用户提供一些图形信息,我们有多远…)。 不幸的是,承载该服务的服务器有点蹩脚,导致了一些严重的响应时间(大约4秒)。另一方面,这会导致我的wpf应用程序等待,结果是:变黑,并且滴度“没有响应” 我已经尝试将此执行放在另一个线程中,但是。。。这是合乎逻辑的,我不会获得任何访问我的wpf窗口控件的权限
我真的很无助。。。有人能给我一些处理程序或解决方案吗?您的UI线程正忙于等待web服务的响应,无法绘制屏幕。一个好的选择是将服务请求推送到另一个非UI线程。看看,这是专门设计的,使这很容易。它处理从非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);
或者您可以研究使用。这基本上就是我尝试过的,但是我得到了“调用线程无法访问此对象,因为另一个线程拥有它。”代码?另外,请确保不要从doWork事件处理程序或它调用的任何东西(在同一个非UI线程上运行)中触摸UI。。。谢谢您的解决方案,但我更喜欢dispatcher变体!