2

如果我正在处理大量数据并且我将它最小化时表单会变成白色但当文件处理完成后它会恢复到它的原始表单时我该怎么办?

前任:

这就是我最小化表单时发生的事情。

在此处输入图像描述

这就是处理大量数据后发生的事情。它会恢复到原来的形式。

在此处输入图像描述

我想要做的是,即使我正在最小化表格,表格也不会变成白色并显示文件处理进度发生了什么。

我正在使用 Visual Studio 2008 和 C# 语言。

4

8 回答 8

6

正如 Massimiliano 的回答所暗示的那样,白色窗口的原因是您正在 UI 线程上执行处理。由于它忙于做任何事情(加密文件,从它的外观来看),线程不能自由地绘制窗口。

查看BackgroundWorker类,了解如何在后台线程上进行处理的好例子。在上面的链接中,大约在页面的中间有一个示例。

于 2012-05-29T16:02:03.627 回答
1

这是一个应该使用 MultiThread 的经典示例

看看下面:

http://visualstudiomagazine.com/articles/2010/11/18/multithreading-in-winforms.aspx

于 2012-05-29T15:58:47.560 回答
1

由于您还没有告诉我们您正在处理的内容是一个样本

//this starts the new thread
Task.Factory.StartNew( () =>
{

   //do you stuff here, I added a windows directory file search
   DirectoryInfo dir = new DirectoryInfo(@"c:\");

   //searches for all files on your computer, it will run for a while, stops after it finds 200
   foreach(var file in dir.EnumerateFiles("*" + textBox1.Text + "*.doc?", SearchOption.AllDirectories).Take(200))
   {
      this.BeginInvoke( new Action(() =>
         {
            //this sends information back to the main ui thread it can be any method at all
            Files.Add(file);
         }));
   }
 });
于 2012-05-29T16:06:27.737 回答
0

让您的长时间运行的工作在后台线程(或工作线程)上执行,这样您的 UI 线程就会响应用户。您看到“白色”是因为您的 UI 线程在执行长时间运行的工作时被阻塞。

如果您在 Google 周围搜索,就会有很多示例,这里有一个示例。

于 2012-05-29T16:01:53.330 回答
0

优雅的解决方案可能是在不同的线程中完成冗长的过程。如果您这样做,请确保您暂时禁用用户界面(可能通过模态显示一个小的进度屏幕)。正如 Chris Shain 建议的那样,Background Worker可能是要走的路。

如果您正在寻找最短的答案并且您可以访问 [en|de]cryption 算法中的一些进度事件,您可以定期调用form.Refresh()来重新绘制屏幕。

于 2012-05-29T16:03:32.313 回答
0

BackgroundWworker 是一种多线程。我认为这比直接使用线程要容易一些。

后台工作者

Dowork 是您加密或解密的时间。并通过 DoWorkEventArgs e 中的争论(文件和加密模式)。在 RunWorkerCompleted 中,您可以显示一条消息,它已完成。或者有一个已完成文件的 ListView。您甚至可以在加密/解密工作时离开加密模式并热打开文件。然后在 RunWorkerCompleted 上启用 Encypt and Decrypt 按钮。

于 2012-05-29T16:04:30.553 回答
0

直到您的应用程序正在计算 UI 线程才处理消息,所以您有一个白色的 from。

你有两种方法可以解决它:

  1. 将所有计算移到单独的线程中。

  2. 从您的计算代码中调用 Application.DoEvents(),这是不好的部分,但它可以工作

多线程示例:

private void ButtonClick(...)
{
  ((Action)Calculation).BeginInvoke(null, null);
}

private void Calculation()
{
  your calculations here
}
于 2012-05-29T16:05:27.683 回答
0

在 windows 窗体中,您应该使用BackgroundWorker在后台工作,并且不要停止 de UI Thread

于 2012-05-29T16:05:58.580 回答