Почему мое консольное приложение c # зависает, когда я пытаюсь выйти? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть консольное приложение, которое иногда НЕ завершается, когда я выдаю следующие 2 строки:

        File.AppendAllText(@"\\bbd\FLog", "Halting: " + DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss") + "\n");
        System.Environment.Exit(0);

Сообщение о прерывании записывается на диск, но приложение все еще живо в диспетчере задач.

Приложение использует таймер потоков:

GetRecordsTimer = new System.Threading.Timer(new TimerCallback(GetRecordsCallBack), null, 60000, 0);

Это объявлено как:

public static System.Threading.Timer GetRecordsTimer;

НО мое понимание Environment.Exit (0) состоит в том, что это убивает все (все потоки), а затем завершает работу.

Примечание. Мало того, что приложение все еще живо, но и мой файл журнала FLog, кажется, используется ...

Возможно, что AppendAllText как-то нетзакончено, если я выйду сразу после этого?

1 Ответ

0 голосов
/ 12 июня 2019

Моя мысль, основанная на том, что вы описываете, заключается в том, что операция сетевой записи в \\bbd не завершается.

Если вы хотите войти и выйти, но выход важнее, чем регистрация, возможно, попробуйте что-то вроде этого:

ThreadPool.QueueUserWorkItem(state => {
    Thread.Sleep(2000);
    Environment.Exit(0);
});
File.AppendAllText(@"\\bbd\FLog", "Halting: " + DateTime.UtcNow.ToString("dd-MM-yyyy HH:mm:ss") + "\n");

Таким образом, ваш процесс завершится через 2 секунды, несмотря ни на что; даже если ваша операция регистрации никогда не завершится.

Более элегантное решение может завершиться, как только операция журнала завершится ИЛИ после истечения времени ожидания, но мой код только для примера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...