2009-06-25 82 views
1

我正在使用线程,它将接收来自 外部应用程序的消息。所以我的线程总是处于活动状态。如何保持线程在整个Windows应用程序中活着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,几次你说有一个循环。你能告诉我们这个循环吗?我没看到一个。您发布的代码将执行一次,然后线程将终止。 – 2009-07-25 20:47:35

回答

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 2009-06-25 05:11:26

2

你的启动代码看起来不错:我的预测是有一个与DaemonEngine.Receiver()不对劲,或许是个例外被抛出,或者功能本身的结构只能处理一条消息......没有看到确切的功能,很难说。

编辑:

为了让我的东西出来的我的意见:

事情错了要杀死你的线程。例外,逻辑错误,我不能告诉你什么,因为没有你的线程中发生的事情的代码,但有些事情正在发生。这与你已经发布的代码无关,它只是让线程运行,而不是让它保持运行。

此外,从你发布的代码中,你只是抛弃了事实上有一个例外。我手边没有链接,但是吞咽例外是可怕的。特别是在一个线程内,它们不会像通常那样正常显示。

也没有迹象表明任何形式的循环,所以它可能是我的一个或两个建议上面,这是造成问题。

+0

我的Deamon.receiver方法在没有任何异常的情况下接收消息。我很确定,因为第一条消息的处理工作正常,我也一行一行地调试。 – Anuya 2009-06-25 05:13:13

0

您的线程可能遇到了未捕获的异常。尝试在正在执行的方法中添加try-catch,并查看是否收到异常。

+0

我的Deamon.receiver方法在没有任何异常的情况下拾取消息。我很确定,因为第一条消息的处理工作正常,我也一行一行地调试。 – Anuya 2009-06-25 05:12:39

2

通常你会DaemonReceiver有这样

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

这使得线程活着代码,直到你在主线程设置quit全局变量。

此外,不要让异常泄漏出您的线索是非常重要的。这些例外情况不会在任何地方报告,并会导致无声错误,可能是您现在遇到的情况。抓住一切,至少报告一下。

相关问题