ApplicationDeployment::CheckForUpdateAsync Method ()
Checks UpdateLocation asynchronously to determine whether a new update is available.
Assembly: System.Deployment (in System.Deployment.dll)
| Exception | Condition |
|---|---|
| InvalidOperationException | ClickOnce throws this exception immediately if you call the CheckForUpdateAsync method while an update is already in progress. |
| DeploymentDownloadException | The deployment manifest cannot be downloaded. This exception appears in the Error property of the CheckForUpdateCompleted event. |
| InvalidDeploymentException | The deployment manifest is corrupted. You will likely need to redeploy the application to fix this problem. This exception appears in the Error property of the CheckForUpdateCompleted event. |
CheckForUpdateAsync returns immediately and starts a separate thread for downloading the updated application. When the method completes or is canceled, it raises the CheckForUpdateCompleted event. You can use AsyncCompletedEventArgs in this event handler to determine whether the operation was canceled, or if an exception was raised during update.
You can cancel an asynchronous update by calling CheckForUpdateAsyncCancel.
Note |
|---|
If CheckForUpdate discovers that an update is available, and the user chooses not to install it, ClickOnce will prompt the user that an update is available the next time the application is run. There is no way to disable this prompting. (If the application is a required update, ClickOnce will install it without prompting.) |
The following example checks for an update asynchronously, and installs the update if one exists.
private: long sizeOfUpdate; private: void Form1_Load(Object^ sender, System::EventArgs^ e) { DoUpdate(); } public: void DoUpdate() { if (ApplicationDeployment::IsNetworkDeployed) { ApplicationDeployment^ currentAppDeployment = ApplicationDeployment::CurrentDeployment; currentAppDeployment->CheckForUpdateCompleted += gcnew CheckForUpdateCompletedEventHandler( this, &Form1::currentDeploy_CheckForUpdateCompleted); currentAppDeployment->CheckForUpdateAsync(); } } // If update is available, fetch it. void currentDeploy_CheckForUpdateCompleted(Object^ sender, CheckForUpdateCompletedEventArgs^ e) { if (nullptr != e->Error) { // Log error. return; } if (e->UpdateAvailable) { sizeOfUpdate = (long) e->UpdateSizeBytes; if (!e->IsUpdateRequired) { System::Windows::Forms::DialogResult updateDialogueResult = MessageBox::Show( "An update is available.Would you like to update the" + " application now?", "Update Available", MessageBoxButtons::OKCancel); if (System::Windows::Forms::DialogResult::OK == updateDialogueResult) { BeginUpdate(); } } else { BeginUpdate(); } } } void BeginUpdate() { ApplicationDeployment^ ad = ApplicationDeployment::CurrentDeployment; ad->UpdateCompleted += gcnew AsyncCompletedEventHandler( this, &Form1::CurrentDeployment_UpdateCompleted); // Indicate progress in the application's status bar. ad->UpdateProgressChanged += gcnew DeploymentProgressChangedEventHandler(this, &Form1::ad_ProgressChanged); ad->UpdateAsync(); } void CurrentDeployment_UpdateCompleted(Object^ sender, AsyncCompletedEventArgs^ e) { if (!e->Cancelled) { if (nullptr != e->Error) { System::Windows::Forms::DialogResult restartDialogueResult = MessageBox::Show( "The application has been updated. Restart?", "Restart Application", MessageBoxButtons::OKCancel); if (System::Windows::Forms::DialogResult::OK == restartDialogueResult) { Application::Restart(); } } else { // Replace with your own error reporting or logging. MessageBox::Show( "The application encountered an error in downloading" + " the latest update. Error: {0}", e->Error->Message); } } else { // Replace with your own error reporting or logging. MessageBox::Show("The update of the application's latest" + " version was cancelled."); } } void ad_ProgressChanged(Object^ sender, DeploymentProgressChangedEventArgs^ e) { String^ progressText = String::Format( "{0:D}K out of {1:D}K downloaded - {2:D}% complete", e->BytesCompleted / 1024, e->BytesTotal / 1024, e->ProgressPercentage); statusStrip1->Text = progressText; }
For full access to the local computer. Associated enumeration: PermissionState.
Available since 2.0
