Запустите определенный поток один раз с приложением, которое может быть выполнено более одного раза

#c#

#c#

Вопрос:

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

До сих пор я пробовал это:

 class Program {
private static EventWaitHandle s_event;

[STAThread]
static void Main(string[] args) {

    bool canCreateTask = false;
    try {
        s_event = new EventWaitHandle(false, EventResetMode.ManualReset, "My Application", out canCreateTask);
    } catch(Exception exception) {
        Console.Write(exception.Message);
    }
    if (canCreateTask) {
        //Create the specific task on a new thread
    }    
}
  

Это отлично работает со следующим сценарием: я запускаю приложение в первый раз, и задача запускается, как ожидалось, если я запускаю приложение в другой раз (без закрытия первого), задача не запускается, что тоже нормально.

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

Я совсем не уверен, смогу ли я достичь этого с помощью EventWaitHandle или я делаю что-то неправильно.

Как я мог бы этого добиться?

Спасибо!

Комментарии:

1. Вы уверены, что task завершилось? Закрытие основного thread не приводит к завершению new thread — насколько мне известно

2. @Симон: если поток помечается как фоновый поток, он не будет держать процесс жив (умрет, когда основной поток(ов), умереть). Если это не фоновый поток, он продолжит выполнение и поддержит процесс в рабочем состоянии.

3. Саймон, @Flydog57, спасибо за ваши ответы, но установка потока в качестве фонового потока, похоже, не решает мою проблему, это работает так же, как я сказал в первом сообщении. Есть что-нибудь еще, что я мог бы попробовать?

4. Это был не ответ, это был комментарий. Это не решит вашу проблему. Что вам нужно, так это более сложный механизм для поддержания межпроцессного состояния. Это не то, что я знаю наизусть, поэтому я надеюсь, что кто-нибудь другой даст ответ. Вам нужно что-то, что останется в некотором «установленном» состоянии независимо от того, сколько процессов было запущено и остановлено. Первый процесс должен запуститься и установить для него значение «OK», а последний завершающийся процесс должен отключить «OK». Скорее всего, это что-то вроде семафора

5. Только пусть программа, которая создает именованное событие синхронизации системы EventWaitHandle (и, таким образом, запускает задачу / поток), придерживает его до завершения программы. Любое дальнейшее выполнение программы, которое получает существующий EventWaitHandle (т. Е., где out bool параметр становится false ), должно немедленно удалить этот EventWaitHandle после проверки canCreateTask . В противном случае экземпляры EventWaitHandle этих вторичных исполнений программ будут привязаны к базовому событию синхронизации системы и поддерживать его в рабочем состоянии, даже если ваше первое выполнение программы (то есть / выполняло задачу / поток) завершится.