Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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# “如何处理长时间跑步”;“线程”;在WPF中?_C#_.net_Wpf_Multithreading - Fatal编程技术网

C# “如何处理长时间跑步”;“线程”;在WPF中?

C# “如何处理长时间跑步”;“线程”;在WPF中?,c#,.net,wpf,multithreading,C#,.net,Wpf,Multithreading,晚上好 目前,我正在为一些rest服务开发一个wpf客户端。与rest服务的通信没有问题,是在一个额外的程序集(通信接口)中完成的 基本上: 我有一个执行方法的“搜索”按钮。此方法与服务通信,更新一些文本框和进度条(为用户提供一些图形信息,我们有多远…)。 不幸的是,承载该服务的服务器有点蹩脚,导致了一些严重的响应时间(大约4秒)。另一方面,这会导致我的wpf应用程序等待,结果是:变黑,并且滴度“没有响应” 我已经尝试将此执行放在另一个线程中,但是。。。这是合乎逻辑的,我不会获得任何访问我的wp

晚上好

目前,我正在为一些rest服务开发一个wpf客户端。与rest服务的通信没有问题,是在一个额外的程序集(通信接口)中完成的

基本上:
我有一个执行方法的“搜索”按钮。此方法与服务通信,更新一些文本框和进度条(为用户提供一些图形信息,我们有多远…)。 不幸的是,承载该服务的服务器有点蹩脚,导致了一些严重的响应时间(大约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变体!