我正在使用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函数的第一行放置一个断点,它永远不会到达那里。
有什么想法吗?
答案 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之外的其他方面操纵形式,并且这个预防正在预防其他对象(包括其中一个)在这里进行了修改。