程序无响应

时间:2009-09-30 02:42:06

标签: c# winforms

好的,我正在Microsoft Visual Studio中创建一个程序,每次运行它并单击start(我有一个启动按钮),它将执行我编程要执行的操作,但表单总是冻结并且不会显示我想要的东西(一旦我启动它就会显示“无响应”)。做这件事很有好处,但我在表格上有东西应该显示出来。虽然它一直在冻结,但它并没有让我选择在它运行期间停止它,或显示我已经设置要更改的任何标签。任何有关这方面的帮助将不胜感激。谢谢。

编辑:这就是我所拥有的:

        void CheckAll()
    {
        for (; ; )
        {
            CheckPixel();
            Application.DoEvents();
        }
    }

它一直在做CheckPixel();我认为这就是它冻结的原因。永远不会有任何休息。

5 个答案:

答案 0 :(得分:4)

这通常意味着您正在阻止UI线程(例如,在按钮单击处理程序中运行长操作)。您通常需要将长I / O操作卸载到ThreadPool或您自己的工作线程,而不是使用UI线程。这并不总是很容易做到,需要仔细的设计和对并发性的理解等。

答案 1 :(得分:4)

你的应用程序正在冻结,因为它处于无限循环中。我不知道你怎么解决它,因为我不知道你到底想要做什么。

更新:因为我需要去睡觉,所以我要在这里完全猜测。你的CheckPixel()方法可能应该有这样的签名:

public bool CheckPixel(int x, int y)
{
    Color color = _myBitmap.GetPixel(x, y);
    return (color == Color.Red);
}

其中_myBitmap是表单范围的位图。然后你的CheckAll()方法应该是这样的:

public bool CheckAll()
{
    for (int x = 0; x < _myBitmap.Width; x++)
    {
        for (int y = 0; y < _myBitmap.Height; y++)
        {
            if (CheckPixel(x, y))
            {
                return true;
            }
        }
    }
    return false;
}

G'night人!我整个星期都会在这里。

答案 2 :(得分:1)

将您的程序放在try-catch块中,然后在消息框中抛出任何异常。 http://msdn.microsoft.com/en-us/library/0yd65esw%28VS.80%29.aspx

另外,尝试在点击点插入一个断点,以确定它到底冻结的位置。

答案 3 :(得分:1)

而不是Application.DoEvents()为什么不用Threading.Thread.Sleep(0)替换?我不是专家,但我更喜欢Thread.Sleep比DoEvents更好。

答案 4 :(得分:0)

你需要有一些退出循环的方式。

你的for循环需要逻辑来自吗?至 ? (如

for(int i = 0; , < 100; 1++) 

将循环100次

OR

for(;;)
{
   if(SomeCondition == true)
   {
      break;
   }
}