Я пытаюсь создать приложение для обновления для приложения wpf. У меня есть кнопка «Обновить» и маленький круглый загрузчик. После нажатия кнопки обновления появится загрузчик. Код обновления использует другой поток. Но когда я пытаюсь запустить другой процесс (Process.Start (path)) из потока обновлений, я получил exeption (вызывающий поток не может получить доступ к этому объекту, потому что ему принадлежит другой поток).не может начать другой процесс из потока C#
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("Ошибка при обновлении.");
}
}
Как я могу запустить другое приложение из другого потока?
В WPF поток WPF может получить доступ к объектам пользовательского интерфейса. http://stackoverflow.com/questions/11625208/accessing-ui-main-thread-safely-in-wpf http://stackoverflow.com/questions/1775843/how-to-directly-access-the -ui-thread-from-the-backgroundworker-thread-in-wpf – user2184057
Какая строка кода генерирует исключение? –
@GlenThomas, var pInfo = new ProcessStartInfo (UpdaterFilePath) {UseShellExecute = false}; var mProcess = new Process {StartInfo = pInfo}; mProcess.Start(); // ИСКЛЮЧЕНИЕ в методе InstallUpdate() –