【问题标题】:windows forms - form freezes when a time-consuming operation takes placewindows 窗体 - 发生耗时的操作时窗体冻结
【发布时间】:2012-09-24 15:42:28
【问题描述】:

我对 Windows 窗体有点陌生。我创建的 Windows 窗体应用程序是执行非常耗时的数据转换任务的组件的前端。数据转换任务发出表单订阅的事件。

当表单接收到事件时,它会更改标签中的文本并为该标签调用Refresh()

当我从表单运行该过程时,它会保持响应并更新标签文本可能一分钟左右。之后,它只是冻结,Windows 将进程声明为“无响应”,直到数据转换完成,此时表单解冻并且标签显示数据转换已完成(如预期的那样)。

我没有将数据转换放到一个单独的线程中 - 这是我应该尝试的第一件事吗?事件可以跨线程吗?如果没有,我还应该怎么做?

【问题讨论】:

  • 你能展示一些你的代码吗..?这是您可以使用 Threading 完成的事情吗?
  • .NET 的哪个版本?较新的版本具有可用于线程的附加选项。无论如何,是的,线程是您的第一选择。有关想法,请参阅此帖子。 stackoverflow.com/questions/464338/…
  • .NET 4. 我看不出为什么不能在另一个线程上完成这项工作。它从文本文件中读取数据,对其进行转换,然后将其写入其他文本文件。

标签: winforms events


【解决方案1】:

是的,线程是您应该工作的地方。根据您的版本,WinForms 中的多线程可能会很棘手。

如果您使用的是 .NET 4.0 或更高版本,则可以使用 Microsoft Task Parallel Library

否则,有一篇来自 C# Corner 的好文章 here,它涵盖了我建议作为起点的 WinForms 应用程序中的线程。

BackgroundWorker 是在 WinForms 中简化线程的另一个选项。

【讨论】:

  • 你的链接是一大堆我一无所知的东西。您的帖子非常有帮助 - 谢谢。
  • 这就是我们在这里的原因。祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多