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函数的第一行放一个断点,但它永远不会到达那里。
有什么想法吗?
我首先注意到这是错误的:对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对象之外的线程操纵表单,而这种放大阻止了其他对象(包括此处所述的对象)被卷入其中。