我正在尝试为wpf应用制作更新应用。我有一个"更新"按钮和一个小圆形装载机。单击更新按钮后,将显示加载程序。更新代码使用另一个线程。但是当我尝试从更新线程启动另一个进程(Process.Start(path))时,我得到了一个exeption(调用线程无法访问该对象,因为另一个线程拥有它)。
private void CheckUpdateButton_OnClick(object sender, RoutedEventArgs e)
{
VisibleLoadingForCheckUpdate = true;
var myThread = new Thread(CheckNeedUpdateApplication);
myThread.Start();
myThread.Name = "UpdateThread";
IsEnabled = false;
}
private void CheckNeedUpdateApplication()
{
if (_baseWindow.ProgramWorked)
{
return;
}
try
{
var myDelegate = new Action(LoaderStop);
if (NeedUpdate())
{
MessageBoxResult updateDecision =
MessageBox.Show(@"Install update?",
@"Update", MessageBoxButton.YesNo);
if (updateDecision == MessageBoxResult.Yes)
InstallUpdate();
Dispatcher.Invoke(myDelegate);
}
else
{
MessageBox.Show(@"No update found", @"Update", MessageBoxButton.OK, MessageBoxImage.Information);
Dispatcher.Invoke(myDelegate);
}
}
catch (Exception)
{
MessageBox.Show(this, @"Connection error",
@"Error", MessageBoxButton.OK, MessageBoxImage.Error);
var myDelegate = new Action(LoaderStop);
Dispatcher.Invoke(myDelegate);
//throw new Exception("Error");
}
}
void LoaderStop()
{
VisibleLoadingForCheckUpdate = false;
IsEnabled = true;
}
private void InstallUpdate()
{
try
{
var newApp = _updateServiceApiClient.GetProgramArchive(_baseWindow.ProgramIdentity);
if (newApp.IsSuccess)
{
using (var decompress = ZipFile.Read(new MemoryStream(newApp.Result)))
{
decompress.ExtractAll(Application.StartupPath + Path.DirectorySeparatorChar + "update", ExtractExistingFileAction.OverwriteSilently);
}
try
{
var pInfo = new ProcessStartInfo(UpdaterFilePath) {UseShellExecute = false};
var mProcess = new Process {StartInfo = pInfo};
mProcess.Start(); //EXCEPTION
_baseWindow.Close();
Close();
}
catch
{
MessageBox.Show(this, @"Update Error.",
@"Error", MessageBoxButton.OK, MessageBoxImage.Error);
LoggerHelper.ErrorsLogger("Update error.");
}
}
}
catch (Exception ex)
{
MessageBox.Show(this, @"Update Error",
@"Error", MessageBoxButton.OK, MessageBoxImage.Error);
//throw new Exception("Ошибка при обновлении.");
}
}
我如何从另一个线程启动另一个应用程序?
答案 0 :(得分:0)
您无法从其他线程更新UI,因为UI在MainThread上运行。您正在使用需要在UI上显示的MessageBox.Show()。而且,当您在另一个线程上时,您无法检索UI控件值。在这种情况下,使用Dispatcher更新UI并从UI控件中读取信息。