Приложение WPF немедленно завершает работу при отображении диалогового окна перед запускомC#

Место общения программистов C#
Ответить
Anonymous
 Приложение WPF немедленно завершает работу при отображении диалогового окна перед запуском

Сообщение Anonymous »

Обновление: Думаю, мне нужно понять, каков «правильный», «поддерживаемый» способ отображения диалогового окна перед запуском приложения в WPF.

Вот код:

Код: Выделить всё

    public partial class App : Application
{
[STAThread]
public static void Main()
{
var app = new App();
app.InitializeComponent();

new DialogWindow().ShowDialog();

app.Run( new MainWindow() );
}
}
Диалоговое окно отображается, как и ожидалось.

Но после его закрытия приложение немедленно закрывается. MainWindow вообще не отображается!

Я провел некоторую отладку и выявил проблему следующим образом:
  • Когда диалоговое окно создано, оно становится MainWindow приложения, поскольку в данный момент MainWindow нет.
  • Поэтому закрытие диалогового окна приводит к публикации приложения ShutdownCallback в очереди диспетчера.
  • Однако диспетчер не работает достаточно долго, чтобы выполнить обратный вызов.
  • Поэтому, как только app.Run вызывается впоследствии, первым объектом в очереди становится ShutdownCallback, что, естественно, приводит к немедленному закрытию приложения.
С учетом этого анализа существует очевидный обходной путь: создайте MainWindow сразу после App, таким образом сделав его MainWindow приложения, что не позволит DialogWindow вызывать закрытие приложения.

Однако вот что меня беспокоит.

Во-первых, мне это кажется грязным хаком. Я имею в виду, что нет явной причины для создания окон в таком порядке, и я нашел это только в результате некоторой отладки. Это не может быть поддерживаемым способом.

Во-вторых, это явная ошибка. Я имею в виду, что если бы создание второго окна после завершения работы не поддерживалось явно, оно должно было бы вызвать какое-то InvalidOperationException, верно?

В-третьих, это не только ошибка, но и выглядит очень наивно, что-то вроде того, что мог бы создать новичок в многопоточности.

Все это заставляет меня думать, что, возможно, я не понимаю здесь чего-то фундаментального? Может я вообще ничего не понимаю? Может быть, все это следует сделать каким-то другим способом?

Вот некоторая предыстория:

Приложению необходимо выполнить некоторую загрузку при запуске. Проверяйте то и это, настраивайте обработчики исключений, логируйте — знаете, обычные вещи. В этом процессе может возникнуть необходимость обратиться к пользователю за помощью — для этого и предназначен диалог.

Мне абсолютно не хочется помещать все это в какой-то конечный автомат, который выполняется на MainWindow.IsVisibleChanged или что-то в этом роде. Мне бы хотелось, чтобы он был по-настоящему простым, коротким и понятным — таким, каким должен быть код начальной загрузки, чтобы можно было легко обнаружить ошибки невооруженным глазом.

Подробнее здесь: https://stackoverflow.com/questions/370 ... re-startup
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»