Как сохранить поток во всем приложении Windows C # - PullRequest
1 голос
/ 25 июня 2009

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

Я хочу, чтобы мой поток работал через приложение, до выхода из приложения. В настоящее время я вызываю мою ветку в program.cs, который является стартапом для приложения Windows c #. Пожалуйста, смотрите код ниже чтобы знать, как я это делаю.

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

Надеюсь, с моим вопросом все в порядке. Пожалуйста помоги. Спасибо.


  static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        StartThread();
        Application.Run(new Screensaver());
    }
    public static void StartThread()
    {
            DeamonEngine Deamon = new DeamonEngine();
            Thread ThreadReciever = new Thread(Deamon.Receiver);
            if (!(ThreadReciever.IsAlive))
            {
                ThreadReciever.Start();
            }
        }
    }

Из комментария:

    void Receiver() { 
        try { 
            Initiate socket s; 
            Bind Ip address; 
            s.Receiver[bytes]; 
            Access the members of message received in bytes;
            Assign the members of message to local variable;
            Read Xml File, get the node values and write to batch file; 
            Execute batch file. 
        } 
        catch { } 
    }

Ответы [ 4 ]

2 голосов
/ 25 июня 2009

Обычно ваш DaemonReceiver будет иметь такой код

while (!quit) 
{
  --- do work ---
  Thread.Sleep(1000);
}

Это сохраняет поток живым, пока вы не установите глобальную переменную quit в основном потоке.

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

2 голосов
/ 25 июня 2009

Выполнение потоком метода Receiver не означает, что поток будет повторно выполнять метод.

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

void Receiver() { 
    while(!done) // without this loop, only one execution will occur
    {
        try { 
            // do stuff
        } 
        catch { 
            // log/handle error
        } 

        // wait for next message
    }
}
2 голосов
/ 25 июня 2009

Ваш стартовый код выглядит нормально: мой прогноз - что-то не так с DaemonEngine.Receiver(), возможно, выдается исключение, или, возможно, сама функция структурирована для обработки только одного сообщения ... Без точного понимания функции это сложно сказать.

EDIT:

Чтобы получить мои вещи из моих комментариев:

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

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

Там также нет указаний на какой-либо цикл, так что это может быть одно или оба из моих предложений выше, что вызывает проблемы.

0 голосов
/ 25 июня 2009

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

...