ShowDialogue不生成DialogueResult.OK

时间:2015-03-21 03:34:39

标签: c# webclient

我正在编写一个应该从GitHub上下载的程序。它有一个指向GitHub上原始文件的链接。我正在使用DownloadDataAsync下载它,我有一个进度条来跟踪它在下载中的位置。它总是达到100%,但它什么也没做。

我一直在关注BetterCoder的C#更新程序教程(开头是here,最相关的部分是本系列的第9部分。)

这是它停止正常工作的部分:

private void DownloadUpdate(SaveyourUpdateXML update)
{
    SharpUpdateDownloadForm form = new SharpUpdateDownloadForm(update.Uri, update.MD5, this.applicationInfo.ApplicationIcon);
    Debug.WriteLine("form created");
    DialogResult result = form.ShowDialog(this.applicationInfo.Context);
    Debug.WriteLine("got result");

    if (result == DialogResult.OK)
    {
        String currentPath = this.applicationInfo.ApplicationAssembly.Location;
        String newPath = Path.GetDirectoryName(currentPath) + "\\" + update.FileName;

        UpdateApplication(form.TempFilePath, currentPath, newPath, update.LaunchArgs);

        Application.Exit();
    }
}

除非取消,否则永远不会得到“得到结果”部分。此外,this.applicationInfo.Context返回一个表单。但是,它确实说“形成了”。

我认为使用ShowDialog的方式有些不对劲,但我不确定是什么。

编辑:创建SharpUpdateDownloadForm时会发生这种情况。

internal SharpUpdateDownloadForm(Uri location, String md5, Icon programIcon)
{
    InitializeComponent();
    if (programIcon != null)
    {
        this.Icon = programIcon;
    }

    tempFile = Path.GetTempFileName();
    this.md5 = md5;
    webClient = new WebClient();

    webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(webClient_DownloadProgressChanged);
    webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(webClient_DownloadFileCompleted);

    bgWorker = new BackgroundWorker();
    bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
    bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_RunWorkerCompleted);

    try
    {
        webClient.DownloadDataAsync(location, this.tempFile);
    }

    catch
    {
        this.DialogResult = DialogResult.No;
        this.Close();
    }
}

这是下载完成时应该发生的事情:

private void webClient_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    if (e.Error != null)
    {
        this.DialogResult = DialogResult.No;
        this.Close();
    }
    else if (e.Cancelled)
    {
        this.DialogResult = DialogResult.Abort;
        this.Close();
    }
    else
    {
        lblProgress.Text = "Verifying Download...";
        progressBar.Style = ProgressBarStyle.Marquee;

        bgWorker.RunWorkerAsync(new string[] {this.tempFile, this.md5});
    }
}

这是bgWorker_RunWorkerCompleted

private void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    this.DialogResult = (DialogResult)e.Result;
    this.Close();
}

和bgWorker_DoWork

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
        String file = ((string[])e.Argument)[0];
        String updateMD5 = ((string[])e.Argument)[1];

        if (Hasher.HashFile(file, HashType.MD5) != updateMD5)
            e.Result = DialogResult.No;
        else
            e.Result = DialogResult.OK;
    }

1 个答案:

答案 0 :(得分:1)

webClient.DownloadDataAsync完成后,它会触发DownloadDataCompleted个事件,而不是DownloadFileCompleted - 您注册的事件。

修复方法是,如果您使用webClient.DownloadDataAsync,请注册DownloadDataCompleted事件;请注意,webClient_DownloadDataCompleted的第二个参数不同。

webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(webClient_DownloadDataCompleted);

...

private void webClient_DownloadDataCompleted(Object sender, DownloadDataCompletedEventArgs e)
{ 
    ...
}