C#使用新线程的启动屏幕

C#使用新线程的启动屏幕,c#,multithreading,process,splash-screen,C#,Multithreading,Process,Splash Screen,我有一个很大的winform应用程序,需要很长时间才能加载,所以我为它编写了一个启动屏幕 问题是,当我从一个新线程显示splash表单时,加载时进度条会冻结2到3次。但是当我用一个分离的过程来做的时候,我没有任何问题,它有一个平滑的运动 我想知道在这种情况下,新线程和分离进程之间有什么区别 谢谢只要把它当作有自己线程的主要形式就行了。当您在该线程上执行任务密集型操作时,它没有机会更新UI。但是,当您创建一个新线程时,实际上是在创建一个可以更新初始屏幕UI的新工作线程,而主窗体的线程正在执行其工作

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

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

我想知道在这种情况下,新线程和分离进程之间有什么区别


谢谢

只要把它当作有自己线程的主要形式就行了。当您在该线程上执行任务密集型操作时,它没有机会更新UI。但是,当您创建一个新线程时,实际上是在创建一个可以更新初始屏幕UI的新工作线程,而主窗体的线程正在执行其工作负载。

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


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

这可能是因为启动屏幕的UI需要位于与主窗口完全不同的线程中,并且具有完全不同的Windows消息队列

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

要启动新的消息泵,请调用
Application.Run(您的SplashScreen)来自单独的线程。也可以从单独的线程创建您的闪屏窗体

请注意,不能通过在单独线程中启动的以不同形式执行的代码直接操纵一种形式的控件。您必须使用
Control.Invoke()
来执行此操作,就像您通常对多个线程所做的那样


无论如何,如果您使用这样一个单独的消息队列,它可以帮助防止您看到的暂停。

请发布相关代码。您如何将进度条的进度与加载应用程序相关联?进度条在什么事件上显示进度?我在application.Run(new MainForm())之前显示启动对话框。进度条动画使用计时器进行移动。请看。我做了如下测试:静态void Main(){Thread t=new Thread(new ThreadStart(splash));t.start();Application.Run(new MainForm();}void splash(){Application.Run(new SplashForm());}但它仍然有同样的问题。@oMatrix啊,真遗憾。那一定还有别的问题。但是使用一个单独的消息队列作为初始屏幕肯定是需要了解的。