【问题标题】:How to keep thread alive throughout the windows application c#如何在整个 Windows 应用程序 c# 中保持线程处于活动状态
【发布时间】:2009-06-25 04:57:30
【问题描述】:

我正在使用线程,它将接收来自 外部应用程序。所以我的线程应该永远活着。

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

【问题讨论】:

  • Karthik,你多次说过有一个循环。你能给我们看看循环吗?我没有看到一个。您发布的代码将执行一次,然后线程将终止。

标签: c# windows desktop-application


【解决方案1】:

让一个线程执行 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
    }
}

【讨论】:

  • 是的。我的 Deamon.receiver 方法接收消息。它运行一个循环来处理我收到的消息。但是一旦它处理了第一条消息,它就会中止。
  • 你能快速概述一下 Deamon.Receiver 方法吗?当然没有主要逻辑......只需留在循环语句中,然后尝试捕获等......
  • Receiver() { 尝试 { 启动套接字;绑定IP地址; s.Receiver[字节];访问以字节为单位接收的消息的成员。将消息的成员分配给局部变量。读取 Xml 文件,获取节点值并写入批处理文件。执行批处理文件。 } 捕捉 { } }
  • 将其添加到问题中会很有用,以便每个人都可以看到。循环部分在哪里?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    编辑:

    从我的 cmets 中取出我的东西:

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

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

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

    【讨论】:

    • 我的 Deamon.receiver 方法毫无例外地接收到消息。我对此很满意,因为第一条消息的处理工作正常,而且我也逐行调试。
    【解决方案4】:

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

    【讨论】:

    • 我的 Deamon.receiver 方法毫无例外地接收到消息。我对此很满意,因为第一条消息的处理工作正常,而且我也逐行调试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多