2014-10-08 62 views
0

我使用Microsoft的WUApiLib庫進行編程。我編寫了一個簡單的應用程序,用於搜索未安裝的所有軟件更新,然後下載並安裝它們。這部分工作完美(我用這裏找到的代碼來幫助:http://www.nullskull.com/a/1592/install-windows-updates-using-c--wuapi.aspx)。C#WUApiLib - 異步下載和安裝

但是,我想使用庫的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

我首先注意到這是錯誤的:對form1.setDownloadProgressText的調用是從不同的異步線程調用UI。你需要將它包裝在一個this.Invoke(如果是WinForms)或Dispatcher.Invoke(如果是WPF)中以將UI操作編組到UI線程中。

而且,「這個」變量不是在構造函數之前發生的成員變量聲明列表中可用,所以

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

是行不通的,除非它是包裹在一個構造函數或形式加載事件處理程序,這裏沒有描繪。

我的猜測是你的onState對象在這裏顯示的一個之前就已經被調用了,而且它正在試圖從一個不同於UI的線程操縱表單,而這個動作就是預防其他對象(包括一個在這裏被扣除)從被調查。

+0

所以不是通過這個,你會通過什麼? – Stephen 2014-10-08 15:31:26

+0

您可以傳遞「this」,但是當您的UI片斷(在您的接口實現中引用)已添加到窗口中時,您可以在函數內部執行此操作,例如在表單加載事件處理程序結束時(InitializeComponent那是)。不過,重要的是將UI操作函數編組到UI線程。再次,我認爲onState實現對象可能會導致錯誤,因爲無法執行此操作,並且錯誤會停止所有操作。 – 2014-10-08 16:55:06

+0

如果您需要更多信息,請不要猶豫,我會盡力進一步澄清。 – 2014-10-08 20:04:29