我有一个很大的 winform 应用程序,需要很长时间才能加载,所以我为它写了一个启动画面。
问题是当我从一个新线程显示启动表单时,进度条会在加载时冻结 2 或 3 次。但是,当我使用单独的过程进行操作时,我没有任何问题,并且动作流畅。
我想知道在这种情况下新线程和分离进程有什么区别。
谢谢
我有一个很大的 winform 应用程序,需要很长时间才能加载,所以我为它写了一个启动画面。
问题是当我从一个新线程显示启动表单时,进度条会在加载时冻结 2 或 3 次。但是,当我使用单独的过程进行操作时,我没有任何问题,并且动作流畅。
我想知道在这种情况下新线程和分离进程有什么区别。
谢谢
简单地把它想象成 Main 表单有它自己的线程。当您在该线程上执行任务密集型操作时,它没有机会更新 UI。但是,当您创建一个新线程时,实际上是在创建一个可以更新启动屏幕 UI 的新工作线程,而主窗体的线程正在执行其工作负载。
进程是应用程序的执行实例。例如,当您双击 Microsoft Word 图标时,您将启动一个运行 Word 的进程。线程是进程内的执行路径。此外,一个进程可以包含多个线程。当您启动 Word 时,操作系统会创建一个进程并开始执行该进程的主线程。
线程和进程之间的另一个区别是同一进程中的线程共享相同的地址空间,而不同的进程则不共享。
这可能是因为初始屏幕的 UI 需要位于与主窗口完全独立的线程中,并具有完全独立的 Windows 消息队列。
要在与主线程不同的线程中运行某些 UI,您需要为其启动一个新的消息泵,因为消息队列不能在线程之间共享。
要启动新的消息泵,请Application.Run(yourSplashScreen);
从单独的线程调用。也可以从单独的线程创建启动屏幕表单。
请注意,您不能直接从以在单独线程中启动的不同形式执行的代码中操作以一种形式的控件。您将不得不Control.Invoke()
这样做,就像您通常使用多个线程一样。
无论如何,如果您使用这样的单独消息队列,它可能有助于防止您看到的停滞。