C# 当我的程序在任何进程中出现时';程序没有响应';和黑屏-在Windows-7中

C# 当我的程序在任何进程中出现时';程序没有响应';和黑屏-在Windows-7中,c#,winforms,C#,Winforms,当我的程序在任何进程中运行时(例如加载csv文件) 我看到了“程序没有响应”,我看到了Windows-7中的黑屏 在Windows XP中,我看不到它 (在此之后,程序继续正常运行) 为什么会发生这种情况?当主线程正在处理一个相对较长的运行任务,因此无法重新绘制屏幕时,就会发生这种情况。您使用工作线程加载csv(在本例中)时不应该出现此问题。很可能是因为您试图在UI线程上执行一个长时间运行的进程(该进程会阻止UI线程,使其无法重新绘制表单) 您应该使用某种形式的线程在单独的线程上启动长时间运行的

当我的程序在任何进程中运行时(例如加载csv文件)

我看到了
“程序没有响应”
,我看到了Windows-7中的黑屏

在Windows XP中,我看不到它

(在此之后,程序继续正常运行)


为什么会发生这种情况?

当主线程正在处理一个相对较长的运行任务,因此无法重新绘制屏幕时,就会发生这种情况。您使用工作线程加载csv(在本例中)时不应该出现此问题。

很可能是因为您试图在UI线程上执行一个长时间运行的进程(该进程会阻止UI线程,使其无法重新绘制表单)


您应该使用某种形式的线程在单独的线程上启动长时间运行的进程,以便UI可以继续运行。

当长时间进程运行时,如果它在UI线程上运行,则会导致应用程序不响应其他UI事件,最明显的是绘制屏幕。在Windows XP和Windows 7中,这将导致应用程序报告为“无响应”,但XP和Windows 7处理窗口绘制的方式不同

在XP中,应用程序实际上更新屏幕,但在windows 7中,操作系统保存当前屏幕的外观,然后使用不同的机制在屏幕上显示(例如,启用Aero时,它实际上使用伪3D纹理显示窗口的内容)

在7中,这可能导致应用程序不响应显示黑色(或根据图形设置,最后一个已知屏幕为淡灰色)屏幕(因为它没有任何最新信息)。而在XP中,它保留旧内容,但在其上拖动窗口会导致窗口的阴影显示在屏幕上,因为较低的窗口不会更新

更新:

你怎么修理它?嗯,有很多不同的东西,但是如果你有一种方法需要很长时间:

private void SomethingThatTakesAReallyLongTime()
{
    System.Threading.Thread.Sleep(30000);
}
您的事件处理程序可以如下所示:

private void button1_Click(object sender, EventArgs e)
{
    ((Action)SomethingThatTakesAReallyLongTime).BeginInvoke(null);
}

在许多情况下,这可能不是一个好主意,但这是一个简单的例子,说明您可以尝试一些事情。

您将占用UI线程(主线程)很长一段时间,很可能是因为操作非常密集(CPU或磁盘)。尝试将密集型操作(例如读取文件)移动到第二个线程中。这将使主线程(一个w/UI)对用户和操作系统保持响应

有许多方法可以实现这一点。使用BackgroundWorker是最简单的实现方法。这应该让你开始:

因此,你必须:

  • 创建后台工作人员

  • 为DoWork事件创建事件处理程序并将其关联到DoWork

  • 将CPU密集型操作放在DoWork事件处理程序中

  • 调用backgroundWorker的RunAsync()方法(这将阻止DoWork事件)

  • 如果提供进度并允许用户取消,您可能会变得更加复杂。以下是加载大文件的示例:


    那我能做什么呢?我能得到一些样本吗?@Gold是的,看看后台工作进程、线程,有很多解决方案,我也用一个可能的简单解决方案更新了我的回答。