我一直在各种论坛,教程或SO上看到回答建议,在单独的线程上运行UI,然后在程序的其余部分运行以保持其响应。
这是如何在实践中完成的?这是否意味着在加载表单之前编辑program.cs
以启动线程?或者这是否意味着从表单中激活的任何非平凡的操作都会分叉一个线程并使用它?或者它是一些设置?你如何使用它?单独线程上的C#UI
回答
要保持UI响应,您应该在单独的线程中运行其他耗时的操作。通常用户界面操作应该在.NET的主(UI)线程中完成。
有几种方法可以为您的操作使用单独的(后台)线程。对于Windows窗体应用程序,最简单的选项是BackgroundWorker
组件。
您也可以自己创建一个Thread
对象。但是在创建线程中调用UI方法或更改UI控件属性时应该小心。正如我所说的,所有用户界面操作(显示表单,更改控制文本或位置等)都应在UI线程中完成。否则你会得到一个异常。要做到这一点,您可以使用Control.Invoke
方法。
通常在C#WinForms应用程序中,Program.cs像这样启动主窗体。
Application.Run(new MyMainForm());
这将创建你的主调度员(GUI)线程,所有的活动都在烧,(按一下按钮,形式负载等)在实践中,如果你需要执行一个长时间的计算,你将创建一个新的后台工作者线程并在完成更新UI时使用它和Invoke回到事件分派器。
如果你在UI线程上执行一个很长的进程,它将锁定UI,它将变得没有响应。
UI在主线程上运行。这个想法是在新线程中运行冗长的操作。不要在自己的线程中执行每一个非平凡的操作,但是导致表单“不响应”的任何内容都是线程的好选择。
在C#中,最简单的方法是使用BackgroundWorker
而不是滚动自己的线程。
教程或SO回答建议在单独的线程上运行UI ......我怀疑这一点。无论如何,UI都在自己的线程上运行。有时它被称为应用程序的“主”线程。为了避免冻结你的应用,你需要在其他线程中进行CPU密集型工作。做这件事的方法很多。查看线程,任务,异步和和。 如果您使用Framework 4.5,您可以使用await SomeTask
功能,无论何时该任务需要超过20-50毫秒才能完成 - 至少这是来自MS工作人员的建议(afaik)
- 1. 用于UI元素的C#单独线程
- 2. 使用视图与单独的线程比UI线程。
- 3. 线程C#UI
- 4. 单独的线程VS SERVICE +单独的线程
- 5. 单独线程上的InitializeComponent性能
- 6. OpenGL:单独线程上的glClientWaitSync
- 7. 在单独的线程上分配PBO?
- 8. 在单独的线程上使用QSerialPort
- 9. 单独线程上的GUI对话框
- 10. 单独线程上的同步HttpPost
- 11. 从wp8应用程序中的单独线程更新UI
- 12. IComparer接口是否在C#中的单独线程上工作?
- 13. C#单例UI线程问题
- 14. 保持线程安全的UI访问器在一个单独的类在c#
- 15. Android:从单独的类中的线程更新UI
- 16. 在单独线程上运行ALAssetLibrary块
- 17. mp3transform |在单独线程上播放(mp3)
- 18. 从单独的线程
- 19. 使用单独的线程
- 20. 在单线程管理器类的UI线程上发布
- 21. 独立的UI线程上的WPF控件?
- 22. 如何在单独的线程中打开第二个UI
- 23. 非UI线程上的DispatcherObject
- 24. C#从UI线程操纵线程
- 25. 多线程COMObject和UI线程(C#)
- 26. 从单独的线程调用UI方法,但不参考UI控件
- 27. UI Media UI上的Android MediaPlayer线程
- 28. C#class libary在单独的线程上显示和更新表单
- 29. 单独线程上的双绞线调用
- 30. 单独线程中的多个表单