2012-11-18 45 views
2

我一直在各种论坛,教程或SO上看到回答建议,在单独的线程上运行UI,然后在程序的其余部分运行以保持其响应。
这是如何在实践中完成的?这是否意味着在加载表单之前编辑program.cs以启动线程?或者这是否意味着从表单中激活的任何非平凡的操作都会分叉一个线程并使用它?或者它是一些设置?你如何使用它?单独线程上的C#UI

回答

3

要保持UI响应,您应该在单独的线程中运行其他耗时的操作。通常用户界面操作应该在.NET的主(UI)线程中完成。

有几种方法可以为您的操作使用单独的(后台)线程。对于Windows窗体应用程序,最简单的选项是BackgroundWorker组件。

您也可以自己创建一个Thread对象。但是在创建线程中调用UI方法或更改UI控件属性时应该小心。正如我所说的,所有用户界面操作(显示表单,更改控制文本或位置等)都应在UI线程中完成。否则你会得到一个异常。要做到这一点,您可以使用Control.Invoke方法。

1

通常在C#WinForms应用程序中,Program.cs像这样启动主窗体。

Application.Run(new MyMainForm()); 

这将创建你的主调度员(GUI)线程,所有的活动都在烧,(按一下按钮,形式负载等)在实践中,如果你需要执行一个长时间的计算,你将创建一个新的后台工作者线程并在完成更新UI时使用它和Invoke回到事件分派器。

如果你在UI线程上执行一个很长的进程,它将锁定UI,它将变得没有响应。

1

UI在主线程上运行。这个想法是在新线程中运行冗长的操作。不要在自己的线程中执行每一个非平凡的操作,但是导致表单“不响应”的任何内容都是线程的好选择。

在C#中,最简单的方法是使用BackgroundWorker而不是滚动自己的线程。

0

教程或SO回答建议在单独的线程上运行UI ......我怀疑这一点。无论如何,UI都在自己的线程上运行。有时它被称为应用程序的“主”线程。为了避免冻结你的应用,你需要在其他线程中进行CPU密集型工作。做这件事的方法很多。查看线程,任务,异步和和。 如果您使用Framework 4.5,您可以使用await SomeTask功能,无论何时该任务需要超过20-50毫秒才能完成 - 至少这是来自MS工作人员的建议(afaik)