WinForm应用程序关闭时,未完成的.NET WebClient异步操作会如何处理?

时间:2018-10-08 17:07:05

标签: c# .net winforms webclient

我试图了解,当WinForms应用程序关闭时,WebClient未完成的异步操作究竟发生了什么。我实际上没有问题,我的问题是由了解确切流程的愿望所驱动。

当请求下载时,该应用程序使用以下模式:

        using (WebClient wc = new WebClient())
        {
                wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(my_DownloadProgressChanged);
                wc.DownloadFileCompleted += new AsyncCompletedEventHandler(my_DownloadFileCompleted);

事件处理程序是Form上的方法。我关心的问题之一是,我不希望在窗体已关闭时调用它们。我可以保留对WebClient的引用,并在窗体上关闭-=,但是我不想做不必要的工作以避免新问题。

以下是我的问题:

  • 为什么在异步操作完成之前可以处置WebClient?
  • 我们是否必须在关闭主窗口时注销处理程序? 如果不这样做会发生什么?我的观察是,如果我关闭表格, 异步回调被调用,但是为什么呢? 关闭?

我查看了WebClient代码,但无法弄清楚这些内容。预先感谢。

1 个答案:

答案 0 :(得分:1)

  

为什么可以在异步操作完成之前处理WebClient?

Reference Source的角度来看,WebClient似乎实际上没有为Dispose方法提供任何特定的实现。处置任何IDisposable并期望异步操作成功完成应该是不安全的,但是在这种情况下,由于部署Web客户端不做任何事情来中止打开的连接,它可能会起作用。

关于您在应用程序退出时会发生什么的问题,操作系统将在进程结束时终止所有打开的连接。