Выход из приложения c # с заставки - PullRequest
0 голосов
/ 24 февраля 2011

Я использую заставку для ac #, которая запускается при запуске и проверяет лицензию приложения.

Я показываю заставку из основной формы следующим образом:

public partial class Form1 : Form
{
    static bool stopThreads = false;
    static bool gridChanged = false;

    public Form1()
    {
        InitializeComponent();
        Thread th = new Thread(new ThreadStart(DoSplash));
        th.Start();
        th.Join();
    }

    private void DoSplash()
    {
        Splash sp = new Splash();
        sp.ShowDialog();
    }

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

Я попытался выйти с помощью:

Enviroment.Exit();

Application.Exit();

Form1 f = new Form1();
this.Close();

Но нетзакрывает основную форму, только заставку.

Как закрыть все приложение из класса формы заставки?

Ответы [ 4 ]

2 голосов
/ 25 февраля 2011

Попробуйте Application.ExitThread()

1 голос
/ 25 февраля 2011

Да, эти вызовы вызывают выход из потока. Вы создали новую тему. В этом случае нет смысла быть благосклонным, Environment.Exit (1) выполнит свою работу. Версия huff-and-puff - Control.BeginInvoke () для запуска кода в основном потоке пользовательского интерфейса. Вам понадобится ссылка на Form1, чтобы сделать этот вызов.

Кстати, у вас также будут большие проблемы с SystemEvents, они запускаются не в том потоке, потому что самое первое созданное вами окно было создано в потоке, отличном от основного потока пользовательского интерфейса. Самый типичный сбой - это тупик, когда вы блокируете и разблокируете рабочую станцию. Вам нужно будет подождать, пока хотя бы одно окно будет создано в потоке пользовательского интерфейса. Переопределение метода OnLoad () Form1 или событие Load было бы хорошим местом для запуска всплеска. Или просто используйте встроенную поддержку для заставок.

0 голосов
/ 25 февраля 2011

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

Иначе ты войдешь в мир боли.

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

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

Application.Exit ()

будет хорошо, если вы вызовете его в главном потоке, как вы должны.

Если вы хотите показать заставку до показа главной формы, вам не следует делать это в основной форме * InitializeComponent. Вместо этого измените код в Program.cs, чтобы сначала показывать заставку:

Application.Run (new SplashScreenForm ());

Где-то в SplashScreenForm (честно, я не знаю, зачем вам это вообще нужно), вам следует проверить лицензию, и, если все в порядке, закройте окно, создайте экземпляр MainForm и вызовите его ShowDialog. Если это плохо - просто закройте окно, и, поскольку это была последняя форма, приложение остановится.

0 голосов
/ 25 февраля 2011

Вы можете использовать Application.Exit() или Environment.Exit().

Это, вероятно, не самый «чистый» способ закрыть ваше приложение, но если вы просто держитесь на экране-заставке, это маловероятноэто вызовет какие-либо проблемы.

Редактировать: Если вы хотите выйти без показа заставки на всех , если лицензия недействительна, вы должны проверить лицензию перед показом заставкии просто выйдите до этого.

...