如何保持线程在整个Windows应用程序C#活着
-
22-07-2019 - |
题
我使用螺纹,其将接收来自消息 外部application.So我的线程shud活着总是如此。
我希望我的线程运行,通过了申请, 直到应用程序退出。目前,我打电话给我的线程在Program.cs中, 它是Windows应用程序C#的启动。请参阅下面的代码 知道我是怎么做的吧。
当我使用下面的代码,线程开始若 应用程序启动...但它放弃一些如何,线程临危后 从外部应用的一个消息。
我希望我和我的questio清楚。请帮忙。感谢。
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 { }
}
解决方案
有一个线程中执行的接收方法,并不意味着该线程将重复执行该方法。
鉴于该问题的处理代码,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
}
}
其他提示
通常是您DaemonReceiver将具有这样的代码
while (!quit)
{
--- do work ---
Thread.Sleep(1000);
}
直到您设置在主线程的quit
全局变量这样可以使线程活着。
此外,它是非常重要的是不要让异常泄漏你的线程。这些异常将不会在任何地方上报,并会导致无记载错误,可能是你现在正在经历什么。做就可以全部渔获物和至少报告。
您启动代码看起来不错:我的预测是有什么毛病DaemonEngine.Receiver()
,或许是个例外被抛出,或者在没有看到确切功能很难说也许是函数本身的结构,只处理单个消息...
修改强>
要得到我的东西出来的我的意见:
事情错了要杀死你的线程。例外,逻辑错误,我不能告诉你,因为没有什么是你的线程内发生的代码,但事情正在发生。这无关你已经发布的代码只是获取线程运行,而不是保持它运行
另外,从已发布的代码,你只是扔掉的事实有一个例外......我没有手头上有链接,但吞咽异常一样,是的可怕。特别是内螺纹,他们不象正常显示反正。
但也没有任何形式的循环的迹象,因此它可能是上面那我的建议是造成问题的一个或两个。
您线程可能会遇到一个例外,这是不被抓住。尝试把一个try-catch中正在执行,看看你得到一个异常的方法。