我正在使用将从中接收消息的线程 外部应用。所以我的线程一直都是活着的。
我希望我的线程能够运行整个应用程序, 直到申请退出。目前我在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 :(得分: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,看看是否有异常。