【问题标题】:C# splash screen using a new thread使用新线程的 C# 启动画面
【发布时间】:2013-05-28 13:13:57
【问题描述】:

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

问题是当我从一个新线程显示启动表单时,进度条会在加载时冻结 2 或 3 次。但是,当我使用单独的过程进行操作时,我没有任何问题,并且运动平稳。

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

谢谢

【问题讨论】:

  • 请贴出相关代码
  • 如何将进度条的进度与申请加载关联起来?进度条在什么事件上显示进度?
  • 我在 application.Run(new MainForm()) 之前显示了启动对话框。进度条动画使用 Timer 进行移动。

标签: c# multithreading process splash-screen


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这可能是因为初始屏幕的 UI 需要位于与主窗口完全独立的线程中,并具有完全独立的 Windows 消息队列。

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

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

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

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

      【讨论】:

      • 我做了这样的测试: static void Main() { Thread t = new Thread(new ThreadStart(splash)); t.start(); Application.Run(新 MainForm()); } void splash() { Application.Run(new SplashForm()); } 但它仍然有同样的问题。
      • @oMatrix 啊,真可惜。那肯定还有别的问题。但是使用单独的消息队列作为启动屏幕肯定是需要了解的。
      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多