好的,我正在Microsoft Visual Studio中创建一个程序,每次运行它并单击start(我有一个启动按钮),它将执行我编程要执行的操作,但表单总是冻结并且不会显示我想要的东西(一旦我启动它就会显示“无响应”)。做这件事很有好处,但我在表格上有东西应该显示出来。虽然它一直在冻结,但它并没有让我选择在它运行期间停止它,或显示我已经设置要更改的任何标签。任何有关这方面的帮助将不胜感激。谢谢。
编辑:这就是我所拥有的:
void CheckAll()
{
for (; ; )
{
CheckPixel();
Application.DoEvents();
}
}
它一直在做CheckPixel();我认为这就是它冻结的原因。永远不会有任何休息。
答案 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;
}
}