使用新线程的C#启动画面

时间:2013-05-28 13:13:58

标签: c# multithreading process splash

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

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

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

由于

3 个答案:

答案 0 :(得分:0)

简单地认为它是主要形式有它自己的线程。当您在该任务密集的线程上执行某些操作时,它无法更新UI。但是,当您创建新线程时,您实际上正在创建一个可以更新启动画面UI的新工作器,而主窗体的线程正在执行其工作负载。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

这可能是因为启动画面的UI需要与主窗口完全独立的线程,并且具有完全独立的Windows消息队列。

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

要启动新消息泵,请从单独的线程中调用Application.Run(yourSplashScreen);。也可以从单独的线程创建启动画面表单。

请注意,您无法直接操作一个表单中的控件,而是以在单独线程中启动的另一种形式执行的代码。您必须使用Control.Invoke()来执行此操作,就像通常使用多个线程一样。

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