Удалите приложение .NET до завершения Application.Run - PullRequest
0 голосов
/ 14 августа 2010

У меня есть проект, в котором отображается пользовательский интерфейс, когда не передаются правильные аргументы командной строки. Это простая утилита, созданная для динамического обновления обоев рабочего стола. Когда это сделано с его обновлением, я звоню

this.Dispose();

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

Я могу с уважением относиться к тому, что я не очень логичен в этом, но я не имею ни малейшего представления о том, как найти решение. Есть ли другой способ чистого вызова метода Dispose () перед загрузкой приложения без возникновения ошибки?

Дополнительная информация:

Выше очевидно не ясно, и я прошу прощения за это. Моя программа запускается из файла Program.cs:

Application.Run(new MainForm());

В конструкторе я проверяю, существуют ли аргументы командной строки, и если это так, вызываю процедуру с именем SilentRun. Этот закрытый метод проверяет, являются ли аргументы допустимыми, и в этом случае передает их методу для совершения действий под названием BrandSystem ().

После завершения BrandSystem () и его работы последний оператор будет

this.Dispose();

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

Причина аргументов командной строки заключается в том, что эта своего рода утилита может быть добавлена ​​в установочный пакет и запущена в фоновом режиме. Мой процесс установки не имеет встроенной возможности обновления обоев, и для меня это утилита «две птицы - один камень».

Проблема возникает, когда программа работает в режиме командной строки и вызывает Dispose до того, как все будет загружено. Я открыт для предложений, даже если они докажут мою логику совершенно несостоятельной.

Ответы [ 2 ]

1 голос
/ 15 августа 2010

Я не вижу весь ваш код, но есть ли причина, по которой ваша программа должна вызывать Application.Run при работе в автоматическом режиме? Если вы исключите запуск графического интерфейса, вам не придется беспокоиться об его утилизации.

Вот как я могу это сделать:

// In main method

if (runningInSilentMode)
{
    // Run the app in silent mode
    // Do core behavior based on arguments, don't call Application.Run
}
else
{
    // Run the app in interactive mode
    // Do core behavior based on the user's input
    Application.Run(new MainForm());
}

Конечно, это предполагает, что логика вашей основной программы не интегрирована с вашим графическим интерфейсом. Если он интегрирован с вашим графическим интерфейсом, вам потребуется выполнить рефакторинг, чтобы отделить его.

1 голос
/ 14 августа 2010

Почему бы просто не пометить его, подождать, пока он загрузится, и выйти из приложения? Утилизация предназначена для конкретной задачи: извлечение ресурсов из неуправляемых объектов.

...