当我的程序在任何进程中时(例如,加载csv文件)
我看到'program Not Responding'和黑屏-在Windows7中
在Windows-XP中我看不到它
(在此之后程序继续正常运行)
为什么会发生这种情况?
发布于 2010-11-12 04:44:20
当一个长进程运行时,如果它在UI线程上运行,这会导致应用程序不响应其他UI事件,最明显的是绘制屏幕。在Windows XP和Windows 7中,这将导致应用程序报告为“无响应”,但XP和Windows 7处理窗口绘画方式不同。
在XP中,应用程序实际上会更新屏幕,但在Windows7中,操作系统会保存当前屏幕的外观,然后使用不同的机制将其显示在屏幕上(例如,在启用Aero的情况下,它实际上会使用伪3D纹理显示窗口的内容)。
在7中,这可能会导致应用程序不响应显示黑色(或最后已知的灰色屏幕,取决于图形设置)屏幕(因为它没有任何最新信息)。而在XP中,它保留了旧的内容,但在它上面拖动一个窗口会导致该窗口的阴影显示在屏幕上,因为下面的窗口没有更新。
更新:
你怎么解决它呢?好吧,有很多不同的东西,但是如果你有一个需要很长时间的方法:
private void SomethingThatTakesAReallyLongTime()
{
System.Threading.Thread.Sleep(30000);
}您的事件处理程序可能如下所示:
private void button1_Click(object sender, EventArgs e)
{
((Action)SomethingThatTakesAReallyLongTime).BeginInvoke(null);
}在许多情况下,这可能不是一个好主意,但这是一个可以尝试的简单示例。
发布于 2010-11-12 05:06:07
您将UI线程(主线程)占用了很长一段时间,这可能是因为操作很密集( CPU或磁盘)。尝试将密集型操作(比如读取文件)移到第二个线程中。这将使主线程(一个带UI的线程)对用户和操作系统做出响应。
有很多方法可以做到这一点。使用BackgroundWorker是最容易实现的。这应该可以让你入门了:http://msdn.microsoft.com/en-us/library/cc221403(VS.95).aspxr
从本质上讲,您将:
你可以在提供进度和允许用户取消时变得更加复杂。下面是一个加载大文件的示例:
http://msdn.microsoft.com/en-us/library/ms229675.aspx
发布于 2010-11-12 04:39:01
当您的主线程正在处理一个相对长时间运行的任务,因此无法重新绘制屏幕时,就会发生这种情况。你使用一个工作线程来加载csv (在这个例子中),你应该不会有这个问题。
https://stackoverflow.com/questions/4159023
复制相似问题