Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#UI在单独的线程上_C#_Multithreading_User Interface - Fatal编程技术网

C#UI在单独的线程上

C#UI在单独的线程上,c#,multithreading,user-interface,C#,Multithreading,User Interface,我一直在各种论坛、教程等上看到有人建议在一个单独的线程上运行UI,然后在程序的其余部分上运行UI,以保持其响应性。 这在实践中是如何做到的?这是否意味着在加载表单之前编辑program.cs以启动线程?或者,这是否意味着从表单中激活的任何非平凡操作都会生成一个线程并使用它?或者是某种背景?如何使用它???通常在C#WinForms应用程序中,Program.cs会像这样启动主窗体 Application.Run(new MyMainForm()); 这将创建主调度程序(GUI)线程,在该线程中

我一直在各种论坛、教程等上看到有人建议在一个单独的线程上运行UI,然后在程序的其余部分上运行UI,以保持其响应性。
这在实践中是如何做到的?这是否意味着在加载表单之前编辑
program.cs
以启动线程?或者,这是否意味着从表单中激活的任何非平凡操作都会生成一个线程并使用它?或者是某种背景?如何使用它???

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

Application.Run(new MyMainForm());
这将创建主调度程序(GUI)线程,在该线程中触发所有事件(按钮单击、表单加载等)。在实践中,如果需要执行长时间的计算,您将创建一个新的后台工作线程,并在完成UI更新时使用该线程和调用返回事件调度程序


如果您在UI线程上执行一个长进程,它将锁定UI并使其失去响应。

UI在主线程上运行。其思想是在新线程中运行冗长的操作。不要在它自己的线程中执行每一个非平凡的操作,但是任何导致窗体“不响应”的操作都是线程的好选择


在C#中,使用
BackgroundWorker
而不是滚动自己的线程可能是最容易的。

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

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


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

教程回答了在单独线程上运行UI的建议。。。我对此表示怀疑。不管怎样,UI都在自己的线程上运行。有时它被称为应用程序的“主”线程。为了避免冻结应用程序,您需要在其他线程中执行CPU密集型工作。实现这一点的方法有很多。检查线程、任务、异步和。 如果您使用框架4.5,您可能会使用
等待某项任务
功能,只要任务可能需要超过20-50毫秒才能完成-至少这是ms人员的建议(afaik)