我一直在各种论坛,教程或SO上看到建议在一个单独的线程上运行UI,然后是程序的其余部分,以保持响应。
这在实践中是如何完成的?是否意味着在加载表单之前编辑program.cs
来启动一个线程?或者它是否意味着从表单中激活的任何非平凡操作都会分叉一个线程并使用它?或者是一些设置?你是如何使用它的?
答案 0 :(得分:4)
要保持UI响应,您应该在单独的线程中运行其他耗时的操作。通常用户界面操作应该在.NET的主(UI)线程中完成。
有几种方法可以为您的操作使用单独的(后台)线程。对于Windows窗体应用程序,最简单的选项是BackgroundWorker
组件。
您也可以自己创建Thread
对象。但是在创建的线程中调用UI方法或更改UI控件属性时应该小心。正如我所说,所有用户界面操作(显示表单,更改控件文本或位置等)都应该在UI线程中完成。否则你会得到一个例外。为此,您可以使用Control.Invoke
方法。
答案 1 :(得分:1)
通常在C#WinForms应用程序中,Program.cs会像这样启动您的主窗体。
Application.Run(new MyMainForm());
这将创建您的主调度程序(GUI)线程,其中所有事件都被触发,(按钮单击,表单加载等)实际上,如果您需要执行长计算,您将创建一个新的后台工作线程和完成更新UI后,使用它和Invoke回到事件调度程序。
如果你在UI线程上执行一个长进程,它将锁定用户界面,它将无法响应。
答案 2 :(得分:1)
UI在主线程上运行。我们的想法是在新线程中运行冗长的操作。不要在自己的线程中执行每个非平凡的操作,但是导致表单“无响应”的任何操作都是线程的一个很好的候选者。
在C#中,最简单的方法是使用BackgroundWorker
而不是滚动自己的线程。
答案 3 :(得分:0)
教程或SO回答建议在单独的线程上运行UI ...我对此表示怀疑。无论如何,UI都在自己的线程上运行。有时它被称为应用程序的“主”线程。为避免冻结您的应用程序,您需要在其他线程中执行CPU密集型工作。这样做的方法很多。查看线程,任务,异步和和。
如果您使用Framework 4.5,则可能会使用await SomeTask
功能,只要任务需要超过20-50毫秒才能完成 - 至少这是MS人员的推荐(afaik)