#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. Кстати, только что исправил опечатку (забыл вторую закрывающую скобку перед точкой с запятой)