C#WUApiLib-异步下载和安装

本文关键字:安装 下载和 异步 C#WUApiLib- | 更新日期: 2023-09-27 18:26:05

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

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

我使用本页上的第一个答案作为模板:C#和WUAPI:BeginDownload函数

然而,我的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函数的第一行放一个断点,但它永远不会到达那里。

有什么想法吗?

C#WUApiLib-异步下载和安装

我首先注意到这是错误的:对form1.setDownloadProgressText的调用是从不同的异步线程对UI的调用。你会想把它包在这个里。调用(如果是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));

除非它被封装在构造函数或表单加载事件处理程序中,否则它不会工作,这里没有显示。

我的猜测是,您的onState对象在此处显示的对象之前被卷入其中,并且它试图从UI对象之外的线程操纵表单,而这种放大阻止了其他对象(包括此处所述的对象)被卷入其中。