C#WUApiLib - 异步下载和安装

时间:2014-10-08 15:11:09

标签: c# winapi asynchronous visual-studio-2013 windows-update

我正在使用Microsoft的WUApiLib库进行编程。我编写了一个简单的应用程序,搜索未安装的所有软件更新,然后下载并安装它们。这部分工作正常(我使用此处的代码来帮助:http://www.nullskull.com/a/1592/install-windows-updates-using-c--wuapi.aspx)。

但是,我想利用库的BeginDownload,EndDownload,BeginInstall,EndInstall功能,以便它可以将进度报告回接口。该文章中的函数是同步的,我提到的函数是异步的。

我使用此页面上的第一个答案作为模板: C# and WUAPI: BeginDownload function

然而,我的Invoke()函数永远不会被调用,我无法弄清楚原因。

iUpdateDownloader_onProgressChanged progress = new iUpdateDownloader_onProgressChanged(this);
IDownloadJob downloadJob = downloader.BeginDownload(progress, new iUpdateDownloader_onCompleted(this), new iUpdateDownloader_state(this));

public class iUpdateDownloader_onProgressChanged : IDownloadProgressChangedCallback
{
    private frmMain form1;

    public iUpdateDownloader_onProgressChanged(frmMain mainForm)
    {
        this.form1 = mainForm;
    }

    // Implementation of IDownloadProgressChangedCallback interface...
    public void Invoke(IDownloadJob downloadJob, IDownloadProgressChangedCallbackArgs e)
    {

        decimal bDownloaded = ((e.Progress.TotalBytesDownloaded / 1024) / 1024);
        decimal bToDownloaded = ((e.Progress.TotalBytesToDownload / 1024) / 1024);
        bDownloaded = decimal.Round(bDownloaded, 2);
        bToDownloaded = decimal.Round(bToDownloaded, 2);

        form1.setDownloadProgressText("Downloading Update: "
         + e.Progress.CurrentUpdateIndex
         + "/"
         + downloadJob.Updates.Count
         + " - "
         + bDownloaded + "Mb"
         + " / "
         + bToDownloaded + "Mb");
    }
}

我可以在Invoke函数的第一行放置一个断点,它永远不会到达那里。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先我注意到这是错误的:对form1.setDownloadProgressText的调用是对来自不同异步线程的UI的调用。你需要将它包装在this.Invoke(如果是WinForms)或Dispatcher.Invoke(如果是WPF)中,以便将UI操作编组到UI线程。

此外,“this”变量在构造函数之前出现的成员变量声明列表中不可用,因此

    iUpdateDownloader_onProgressChanged progress = new iUpdateDownloader_onProgressChanged(this);
    IDownloadJob downloadJob = downloader.BeginDownload(progress, new       
    iUpdateDownloader_onCompleted(this), new iUpdateDownloader_state(this));

不会起作用,除非它包含在构造函数或表单加载事件处理程序中,这里没有图示。

我的观点是你的国家对象在这之前就已经被调用了,并且它正试图从除了UI之外的其他方面操纵形式,并且这个预防正在预防其他对象(包括其中一个)在这里进行了修改。