c#启动屏幕使用一个新线程

本文关键字:一个 新线程 线程 启动 屏幕 | 更新日期: 2023-09-27 18:15:47

我有一个大的winform应用程序,需要很长时间才能加载,所以我为它写了一个启动屏幕。

问题是,当我从一个新线程显示splash表单时,进度条将在加载时冻结2或3次。但是当我使用分离过程时,我没有任何问题,它有一个平滑的运动。

我想知道在这种情况下,一个新线程和一个分离的进程有什么区别。

谢谢

c#启动屏幕使用一个新线程

就像Main表单有自己的线程一样。当你在线程上做一些任务密集型的事情时,它没有机会更新UI。然而,当你创建一个新线程时,你实际上是在创建一个新的工作者,它可以更新启动屏幕UI,而主表单的线程正在执行它的工作负载。

进程是应用程序的执行实例。例如,当你双击Microsoft Word图标时,你启动了一个运行Word的进程。线程是进程内的执行路径。另外,一个进程可以包含多个线程。当你启动Word时,操作系统创建了一个进程,并开始执行该进程的主线程。

线程和进程之间的另一个区别是,同一进程中的线程共享相同的地址空间,而不同的进程则不共享。

这可能是因为闪屏的UI需要在一个完全独立的线程中,与主窗口有一个完全独立的Windows消息队列。

要在与主线程不同的线程中运行一些UI,你需要为它启动一个新的消息泵,因为消息队列不能在线程之间共享。

要启动一个新的消息泵,从单独的线程调用Application.Run(yourSplashScreen);。从单独的线程创建你的闪屏表单。

请注意,您不能直接操作一个窗体中的控件,而代码执行在另一个单独的线程中启动的另一个窗体。您必须使用Control.Invoke()来这样做,就像您通常使用多个线程一样。

无论如何,如果你像这样使用一个单独的消息队列,它可以帮助防止你所看到的拖延。