C# APP 在运行时冻结 [关闭]

Posted

技术标签:

【中文标题】C# APP 在运行时冻结 [关闭]【英文标题】:C# APP freezes during runtime [closed] 【发布时间】:2013-07-03 18:21:29 【问题描述】:

这里是代码,我已经在命令行应用程序中测试了 snmpconn 方法,但它在 Windows 窗体应用程序中运行时冻结,我没有理由吗?

 public snmpmain()
    
        InitializeComponent();
    

    private void Form1_Load(object sender, EventArgs e)
    
        this.button1.Click += new System.EventHandler(this.snmpconn);
    

    private void button1_Click(object sender, EventArgs e)
    
        //button1.Enabled = false; will disable the button before the event is fired
       this.button1.Click += new System.EventHandler(this.snmpconn);
    

    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    

    

        int port = 162;
       // UdpClient listener;
    //    IPEndPoint groupEP;
        byte[] packet = new byte[1024];

        int commlength, miblength, datatype, datalength, datastart, Objecttype, Objectlength;
        int agent;
        int timestamp;
        int entrspc;
        int specifictrap;
        int finallen;
        int objectstart;
        string objectid;
        string test1;
        byte[] test2 = new byte[1024];
        int temp;
        string tempo;


      private void snmpconn(object sender, System.EventArgs e)
        
            listBox1.Items.Add("Initializing" + port + "...");
            this.button1.Click -= new System.EventHandler(this.snmpconn);

            UdpClient listener = new UdpClient(port);
            IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, port);

            while (true)
            
                listBox1.Items.Add("Waiting....");

                    packet = listener.Receive(ref groupEP);


                listBox1.Items.Add("Processing...");
                if (packet.Length != 0)
                 // do some work 
                  
             
         

这适用于命令行应用程序。

你有线索吗?

【问题讨论】:

请阅读***.com/help/dont-ask 抱歉,我不是来为您调试代码的。 如果您可以提供具体的错误消息、堆栈跟踪等,那么我们将能够为您提供更多帮助。将军“这是我的代码,怎么了?”问题没有得到很好的接受。所以通过调试器运行你的代码,看看会发生什么:) 问题是程序冻结,因此我认为没有错误消息....我建议您先检查while (true) 部分。 PS:我们应该只关注问题而不是规则...... 如其他地方所述,while (true) 非常可怕,但在 windows 消息循环线程上尤其是坏消息,这可能解释了为什么您的控制台应用程序似乎可以工作。您的 Windows 应用程序无法继续处理 UI 事件,因为您已经永远占用了消息循环。 【参考方案1】:

哇,我没有注意到主要错误就回答了!

while (true)

如果您不确定自己在做什么,请不要这样做,几乎永远不要这样做! 您在循环中分配了 100% 的进程资源,而不会留下一点 CPU 来执行渲染。

在尝试使您的代码正常工作之前,您应该阅读并了解多线程和同步。

那么,您将太多事件绑定到您的 btn 点击!

这一行:

   this.button1.Click += new System.EventHandler(this.snmpconn);

button1_Click 事件不需要。

此外,在点击时使用绑定事件可能会产生误导,您可以使用标志(true/false)来检查是否在点击 btn 时执行您的功能。

【讨论】:

还是一样,我遇到挂机问题 如果while (true) 搞砸了,为什么它在命令行中工作? 当然也不是 while 循环。即使删除它仍然挂起。 好吧,while(true) 循环永远不会退出,它会永远持续下去。在命令行中,它可能作为控制台应用程序工作,不绑定到任何渲染 UI 线程。 如果它仍然挂起,你的线程执行挂在某个地方(例如 listener.Receive 方法),所以请在后台线程中调用它。查找多线程信息。

以上是关于C# APP 在运行时冻结 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Matlab GUI中的无限循环导致关闭GUI时Matlab冻结?

iAD 视图在广告关闭时冻结

TestFlight 应用程序在启动时冻结 [关闭]

从收藏视图切换视频时,Swift 播放器冻结但音频仍然在后台运行

关闭后引导模式冻结页面

来自后台时iOS App UI冻结