为什么WPF应用程序在客户端代理异步调用WCF后没有关闭?

时间:2016-04-28 16:49:01

标签: c# wpf wcf asynchronous

你好我有WCF的下一个问题。我使用"基于任务的"生成我的客户端代理类。异步模式。 使用同步方法一切都很好,但是当我调用异步方法(无效或无关 - 无关)并关闭我的WPF MainWindow(通过标题栏上的交叉)时,窗口关闭但进程未被杀死。这只发生在异步调用之后。

我试试这个:

var client = new Service.ServiceClient();
await client.syncWithDevicesAsync();
client.Close();

并使用':

using (var client = new Service.ServiceClient())
{
  await client.syncWithDevicesAsync();
}

我看过类似的问题,但我无法理解,请解释为什么会这样。求助。

UPD:在调试线程窗口中我看到当我调用异步方法时,创建了4个线程,但在响应后只释放了3 .. GC.Collect()在关闭窗口事件中没有帮助。

UPD2:Julian回答后我尝试下一步:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var proxy = new ServiceReference1.ServiceClient();

    var photo = await proxy.getEmployeePhotoAsync(12);
    label.Content = photo.Length; //everything is good, label show correct size. So the asynchronous method is completed?
    proxy.Close();
    //Environment.Exit(0);  //- if uncomment window freeze forever. label nothing show. 
}

试试这个:

await Task.Run(async () => 
                {
                    var photo = await proxy.getEmployeePhotoAsync(12);
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        label.Content = photo.Length;
                    });
                });
UPD3:哦......现在我完全卡住了。我下载github example by Mahesh Sabnis。和相同的行为,关闭后进程在任务管理器中挂起。有人可以自己测试吗?

2 个答案:

答案 0 :(得分:1)

Task.Run使用异步方法:

  

将任务执行队列在线程池线程上。线程在执行   进程的上下文(例如,运行应用程序的可执行文件)

因此它没有在UI线程(SO

上运行

我认为在你关闭WPF窗口并且UI线程停止后,在后台仍然运行某些异步方法(可能甚至是循环)。因此,该过程仍在运行。

您可以将CancellationToken传递给后台任务,然后在应用程序退出事件中调用Cancel

作为最后的手段,您还可以调用终止该过程的System.Environment.Exit()方法。

答案 1 :(得分:0)

我不确定是否有其他人会这样,但我仍会写一个答案。我第一次遇到这个..

问题发生在我的电脑或VS2013中..我重新启动电脑,所有工作都是:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var proxy = new ServiceReference1.ServiceClient();

    var photo = await proxy.getEmployeePhotoAsync(12);
    label.Content = photo.Length; 
    proxy.Close();
}