1

我正在使用将从外部应用程序接收消息的线程。所以我的线程应该永远活着。

我希望我的线程在应用程序中运行,直到应用程序退出。目前我在 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

4 回答 4

2

您的启动代码看起来不错:我的预测是 有什么问题DaemonEngine.Receiver(),可能引发了异常,或者函数本身的结构可能只处理一条消息......没有看到确切的函数很难说。

编辑:

从我的评论中删除我的东西:

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

此外,从您发布的代码中,您只是抛弃了存在异常的事实......我手头没有链接,但是吞下这样的异常是可怕的。尤其是在它们无论如何都不会像平常一样出现的线程中。

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

于 2009-06-25T05:02:51.287 回答
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
    }
}
于 2009-06-25T05:05:00.757 回答
2

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

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

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

此外,不要让异常从您的线程中泄漏出来,这一点非常重要。这些异常不会在任何地方报告,并且会导致静默错误,可能是您现在遇到的错误。全力以赴,至少报告一下。

于 2009-06-25T05:18:31.753 回答
0

您的线程可能遇到异常,该异常未被捕获。尝试在正在执行的方法中放置一个 try-catch 并查看是否出现异常。

于 2009-06-25T05:03:23.567 回答