你好我有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。和相同的行为,关闭后进程在任务管理器中挂起。有人可以自己测试吗?
答案 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();
}