Окно WPF не закрывается

#c# #wpf

#c# #wpf

Вопрос:

не могли бы вы рассказать новичку, почему это небольшое WPF-приложение не закрывается должным образом после срабатывания события WorkflowTerminated? Используемый рабочий процесс просто немедленно завершается. (с использованием приложения WPF, .Net Framework 3.5)

 public partial class MainWindow : Window
{
    private WorkflowRuntime wfRuntime = new WorkflowRuntime();

    public MainWindow()
    {
        InitializeComponent();

        wfRuntime.WorkflowTerminated  = (se, ev) => this.Close(); // this doesn't close the window
        wfRuntime.WorkflowCompleted  = (se, ev) => this.Close();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        WorkflowInstance launcherWorkflow = wfRuntime.CreateWorkflow(typeof(InstallerWorkflow));

        launcherWorkflow.Start();
    }
}
  

Комментарии:

1. Выполняется ли оно вообще при установке точки останова в обработчике завершенных событий?

2. Кстати, хороший вопрос, это преследовало меня раньше, и было очень трудно понять, 1

Ответ №1:

Вероятно, потому, что обратный вызов выполняется в другом потоке. Основным обходным путем является полное завершение работы приложения с помощью Environment.Exit(1);

Для вызова функции close в потоке пользовательского интерфейса вы должны использовать:

 wfRuntime.WorkflowTerminated  = (se, ev) => {
    // call back to the window to do the UI-manipulation
    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() 
    {
       this.Close();
    }));
};
  

Комментарии:

1. У моего объекта Application нет метода exit(). Вероятно, потому, что это приложение WPF? Я попробовал приложение. Текущее. Завершение работы (), которое не помогает. По-прежнему не закрывается…

2. Как я мог бы отправить событие завершения в нужный поток (поток GUI)?

3. Environment.Exit() работает, приложение закрывается. Но это кажется немного грязным 😉 Есть ли более чистый способ достичь моей цели (т. Е. Обработать событие в правильном потоке, чтобы Close () работал так, как задумано?). Тем не менее, спасибо за вашу помощь до сих пор!

4. Да, я обновил ответ на обратный вызов метода Close() в потоке пользовательского интерфейса, чтобы окна пользовательского интерфейса закрывались правильно.

5. Кстати, только что исправил опечатку (забыл вторую закрывающую скобку перед точкой с запятой)