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

时间:2009-05-22 22:14:34

标签: c# .net wpf multithreading

晚上好!

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

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

我已经尝试将此执行放在另一个线程中,但是......我无法访问我的wpf窗口的控件,这是合乎逻辑的......

atm我真的很无奈......有谁可以给​​我一些handeling例程或解决方案?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

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

或者您可以查看使用BackgroundWorker