DownloadFileCompleted事件获胜';不显示简单的MessageBox

本文关键字:显示 简单 MessageBox 事件 获胜 DownloadFileCompleted | 更新日期: 2023-09-27 18:00:05

我正在尝试实现WebClient.DownloadFileCompleted事件,主要是在下载被取消的情况下删除文件。

DownloadFileCompleted事件:

private void _web_client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
        if (e.Cancelled)
        {
            //Delete the file in here
            MessageBox.Show("Download cancelled!"); // Doesn't work
            File.WriteAllText("output.txt", "Test string"); //Works
            throw new Exception("Some Exception"); //Program doesn't crash
        }
        else
        {
            MessageBox.Show("Download succeeded!"); // Works
        }
}

FormClosing事件:

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
         _web_client.CancelAsync();
}

因此,如果我只是让下载完成,就会显示"成功消息框"。但是,如果我在下载应用程序时关闭它,则不会显示MessageBox,程序也不会崩溃,尽管我抛出了一个未处理的异常。另一方面,创建文本文件并填充测试字符串。

那么,为什么这不起作用呢?我应该如何处理File.Delete调用引发的可能异常?

(注意,我使用的是WebClient.DownloadFileAsync)

提前感谢!

DownloadFileCompleted事件获胜';不显示简单的MessageBox

MessageBox.Show不工作,因为本应是MessageBox所有者的表单已被释放。如果将Show方法的owner参数设置为表单的当前实例,则会得到一个System.ObjectDisposedException。现在,你可以做的是:

private void _web_client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        //Delete the file in here
        MessageBox.Show("Download cancelled!");
        File.Delete(@"path'to'partially'downloaded'file");
        this.Close(); 
    }
    else
    {
        MessageBox.Show("Download succeeded!"); // Works
    }
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (_web_client.IsBusy)
    {
        e.Cancel = true;
        this._web_client.CancelAsync();
    }       
}