2009-06-25 2 views
1

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

Я хочу, чтобы мой поток запускал приложение, до выхода приложения. В настоящее время я вызываю свой поток в 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 { } 
    } 
+0

Karthik, несколько раз вы сказали, что есть петля. Не могли бы вы показать нам цикл? Я его не вижу. Код, который вы отправили, будет выполняться один раз, затем поток завершится. –

ответ

2

Имея поток, выполняющий метод 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 
    } 
} 
+0

есть. Мой метод Deamon.receiver получает сообщение. Его запуск цикла для обработки сообщения, которое я получаю. Но как только он обрабатывает первое сообщение, он прерывается. – Anuya

+0

Можете ли вы быстро нарисовать схему Deamon.Receiver? без основной логики, конечно ... просто оставьте в циклах заявления, а попытки поймать и т. д. –

+0

Receiver() { try { tryation socket s; Bind Ip address; s.Receiver [bytes]; Доступ к сообщениям, полученным в байтах. Назначьте членам сообщения локальную переменную. Прочитайте файл Xml, получите значения узлов и напишите в командный файл. Выполнение командного файла. } catch {} } – Anuya

2

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

EDIT:

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

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

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

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

+0

Метод My Deamon.receiver выбирает сообщение без каких-либо исключений. Я так понимаю, потому что обработка первого сообщения работает нормально, и я также отлаживаю линию за строкой. – Anuya

0

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

+0

Метод My Deamon.receiver получает сообщение без каких-либо исключений. Я так понимаю, потому что обработка первого сообщения работает нормально, и я также отлаживаю линию за строкой. – Anuya

2

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

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

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

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

Смежные вопросы