【问题标题】:C# software freezing when setting property to true将属性设置为 true 时 C# 软件冻结
【发布时间】:2018-11-28 18:09:12
【问题描述】:

我有以下代码:

public partial class Form1 : Form
{
    // our config
    public bool runBot, afkModeToggle, shutdownPcToggle = false;
    public int roundsToPlay, minsToPlay, waitInLobbyFor, waitInDeathScreenFor;

    public void addToLogs(string logmsg)
    {
        richTextBox1.AppendText("\r\n" + logmsg);
        richTextBox1.ScrollToCaret();
    }

    public void startsoftware()
    {
        runBot = true;
        addToLogs("[" + DateTime.Now + "] Bot has started");
        label22.Text = " RUNNING" + runBot;
        label22.ForeColor = System.Drawing.Color.DarkGreen;
    }

    public void pausesoftware()
    {
        runBot = false;
        addToLogs("[" + DateTime.Now + "] Bot has been paused");
        label22.Text = " PAUSED" + runBot;
        label22.ForeColor = System.Drawing.Color.Crimson;

        if (checkBox3.Checked) 
        { 
            Process.Start("shutdown", "/s /t 0");
        }
    }

    public bool processrunning()
    {
        Process[] pname = Process.GetProcessesByName("notepad");
        if (pname.Length == 0)
        {
            label23.Text = "process Not Found";
            label23.ForeColor = System.Drawing.Color.Crimson;
            return false;
        }
        else
        {
            label23.Text = "process Found";
            label23.ForeColor = System.Drawing.Color.DarkGreen;
            return true;
        }
    }

    //
    // form follows
    //

    public Form1()
    {
        InitializeComponent();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        while(runBot == true)
        {
            if(processrunning() == true)
            {
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        startsoftware();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        pausesoftware();
    }
}

它是通过 Visual Studio 构建的基本表单。当我单击按钮 1 时,它只会冻结软件,而您无法单击其他任何内容。我已经将其追溯到这一点 - 如果我在 startsoftware 函数中注释掉 runBot = true ,它将起作用,但是该行会导致冻结。

我错过了什么吗?

【问题讨论】:

  • runBot 在哪里使用?它是否在另一个线程上使用?
  • 你需要发布所有相关代码,看看如何创建minimal reproducible example
  • 我觉得还有更多。表单上是否有任何控件“侦听”要更改的 botRun 值?
  • 人们要求更多信息的原因是您发布的代码可以正常工作,因此问题一定出在其他地方。您需要单步执行您的代码并查看它挂在哪里(在分配上设置断点,然后使用 F10/F11 单步执行代码)。至少,在 Visual Studio 挂起时按下“暂停”按钮,以便查看正在执行的行。
  • 不要在计时器滴答声中添加循环。 runBot 应该只是计时器上的 Enabled 属性。

标签: c# class properties freeze


【解决方案1】:

Windows 窗体有一个 UI 线程。该线程负责更新 UI,并处理 UI 相关事件。如果此线程被阻塞,那么您的 UI 将变得无响应。

计时器滴答事件由此 UI 线程处理,因此当您在此事件处理程序中启动长循环时,UI 线程无法处理 UI 的其余部分,并且您的程序似乎冻结了。

有几种方法可以在您的代码中解决此问题。您可以删除

while(runBot == true)

从您的计时器滴答事件中,让计时器定期滴答。当您不希望 processrunning 检查运行时,您可以禁用计时器。 如果您不想让用户在此期间点击某些东西,您可以禁用按钮。

另一种选择是有一个后台线程调用processrunning 并相应地设置一个标志。

【讨论】:

    【解决方案2】:

    这部分代码需要更改,否则您将永远循环:

    while(runBot == true)
    {
        if(processrunning() == true)
        {
        }
    }
    

    也许在处理过程中将runbot设置为false?

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2022-10-11
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      相关资源
      最近更新 更多