如何在整个Windows应用程序中保持线程活动c#

时间:2009-06-25 04:57:30

标签: c# windows desktop-application

我正在使用将从中接收消息的线程 外部应用。所以我的线程一直都是活着的。

我希望我的线程能够运行整个应用程序, 直到申请退出。目前我在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 个答案:

答案 0 :(得分:2)

您的启动代码看起来很好:我的预测是DaemonEngine.Receiver()出现了问题,可能是抛出异常,或者函数本身可能只处理单个消息......没有看到确切的函数很难说。

修改

从我的评论中得到我的东西:

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

此外,根据你发布的代码,你只是丢掉了一个例外的事实......我手边没有链接,但吞下这样的例外是可怕的。特别是在一个他们没有像往常一样出现的线程中。

也没有任何类型的循环迹象,因此可能是我上面的一个或两个建议导致问题。

答案 1 :(得分: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
    }
}

答案 2 :(得分:2)

通常你的DaemonReceiver会有这样的代码

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

这使线程保持活动状态,直到在主线程中设置quit全局变量为止。

此外,不要让异常从您的线程中泄漏是非常重要的。这些异常不会在任何地方报告,并且会导致无声错误,可能是您现在遇到的问题。抓住所有并至少报告它。

答案 3 :(得分:0)

您的主题可能遇到异常,但未被捕获。尝试在正在执行的方法中放置try-catch,看看是否有异常。