无法从线程c#开始另一个进程

时间:2015-08-07 10:39:22

标签: c# wpf multithreading

我正在尝试为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("Ошибка при обновлении.");
    }
}

我如何从另一个线程启动另一个应用程序?

1 个答案:

答案 0 :(得分:0)

您无法从其他线程更新UI,因为UI在MainThread上运行。您正在使用需要在UI上显示的MessageBox.Show()。而且,当您在另一个线程上时,您无法检索UI控件值。在这种情况下,使用Dispatcher更新UI并从UI控件中读取信息。