【发布时间】:2019-04-12 01:26:37
【问题描述】:
一段时间以来,我一直在使用 ClickOnce 为我的应用程序部署更新。虽然我很高兴能够做出改进,但我对当前的进度条有点失望。一点背景知识 - 我有一个名为“UpdateProgress”的 XAML 窗口类,当应用程序进行更新时我会打开它。这是我现在正在使用的当前代码 sn-p,它至少会通知用户正在取得进展而不会冻结应用程序/崩溃,但不会直观地更新进度条:
case UpdateStatuses.UpdateAvailable:
DialogResult dialogResult = System.Windows.Forms.MessageBox.Show("An update is available. Would you like to update the application now?", "Update available", MessageBoxButtons.OKCancel);
if (dialogResult.ToString() == "OK")
{
BackgroundWorker bgUpdate = new BackgroundWorker();
UpdateProgress updateNotify = new UpdateProgress();
bgUpdate.WorkerReportsProgress = true;
bgUpdate.DoWork += (uptSender, uptE) => { UpdateApplication();};
bgUpdate.ProgressChanged += (progSender, progE) => { updateNotify.updateProgress.Value = progE.ProgressPercentage; };
bgUpdate.RunWorkerCompleted += (comSender, comE) => {
updateNotify.Close();
applicationUpdated();
};
updateNotify.Show();
bgUpdate.RunWorkerAsync();
}
break;
基本上,我在上面创建了一个后台工作者,它运行下面的代码:
private static void UpdateApplication()
{
try
{
ApplicationDeployment updateCheck = ApplicationDeployment.CurrentDeployment;
//BackgroundWorker bgWorker = new BackgroundWorker();
//UpdateProgress updateNotify = new UpdateProgress();
//updateCheck.UpdateProgressChanged += (s, e) =>
//{
// updateNotify.updateProgress.Value = e.ProgressPercentage;
//};
//bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(UpdateComponent.noteUpdates);
//bgWorker.RunWorkerAsync();
//updateCheck.UpdateCompleted += (s, e) =>
//{
// updateNotify.Close();
// applicationUpdated();
//};
//updateNotify.Dispatcher.InvokeAsync(() =>
// {
//updateNotify.Show();
updateCheck.Update();
//});
//return null;
}
catch (DeploymentDownloadException dde)
{
System.Windows.MessageBox.Show("Cannot install the latest version of the application. Please check your network connection, or try again later. Error: " + dde);
//return null;
}
}
快速解释,目前我只创建一个名为“updateCheck”的“ApplicationDeployment”实例,并让它在这个线程中运行更新。我之前尝试过的是加载下面的一些注释代码,只是在更新时看到应用程序崩溃。事实证明,在使用我的应用程序的 PROD 实例进行调试时,这是由于以下错误:
调用线程无法访问此对象,因为另一个线程拥有它。
现在,做一些挖掘,我已经看到了很多关于这个的好读物。据我了解,部分问题是我试图从与我的 MainWindow 和其他 UI 类分开的静态类中运行此代码。我这样做是为了保持我的代码干净和模块化,但显然,这是有代价的。我意识到如果进度条的进度百分比位于进度条窗口的代码隐藏中,则可以绑定它,但是如果我试图坚持在我所说的静态类中运行它呢?我尝试过使用 Dispatcher 方法/BeginInvoke() 之类的方法,但不幸的是得到了相同的结果。
有人可以就如何在窗口中使用 ApplicationDeployment 实例的更新例程的百分比进度来更新我的进度条的进度给我最好的建议吗?
提前非常感谢。
【问题讨论】:
-
IProgress<T>呢? -
@Aybe 你的意思是,在 UpdateApplication 方法上?
-
我想我只是没有把两个和两个放在一起。我看到他们正在任务中运行工作,这似乎是有道理的,但我没有连接任务将如何帮助将进度报告到进度条?
-
检查我的答案,希望你现在就明白了。
标签: c# wpf progress-bar clickonce auto-update