如何在执行功能期间使应用程序加载屏幕

时间:2011-10-11 12:46:47

标签: c# .net multithreading winforms backgroundworker

我想在执行功能期间创建加载屏幕 - 比如在游戏,新窗口或某些图形中加载屏幕。

所以我按下按钮“开始” - 应用程序开始做一些东西,子窗体窗口显示图形 - “功能正在进行中,请稍候”

怎么做?

3 个答案:

答案 0 :(得分:6)

您可以使用BackgroundWorker在单独的线程中执行您的功能。 BackgroundWorker有很多功能可以支持您正在寻找的功能。如果你没有使用另一个线程来执行你的函数,主线程(UI线程)将忙,子窗口将无法正常工作。

有关backgroundWorker的一些重要说明。 DoWork在不同的线程中,向主线程报告进度并取消异步进程是BackgroundWorker中最重要的功能。下面的例子非常清楚地展示了这三个功能。但它显示任务完成的实际百分比。如果您只想显示消息并ProgressBar添加Marquee style,则无需启用WorkerReportsProgress标记,也无需ProgressChanged事件实现。

网上有大量的例子。

using System;
using System.Threading;
using System.ComponentModel;

class Program
{
  static BackgroundWorker _bw;

  static void Main()
  {
    _bw = new BackgroundWorker
    {
      WorkerReportsProgress = true,
      WorkerSupportsCancellation = true
    };
    _bw.DoWork += bw_DoWork;
    _bw.ProgressChanged += bw_ProgressChanged;
    _bw.RunWorkerCompleted += bw_RunWorkerCompleted;

    _bw.RunWorkerAsync ("Hello to worker");

    Console.WriteLine ("Press Enter in the next 5 seconds to cancel");
    Console.ReadLine();
    if (_bw.IsBusy) _bw.CancelAsync();
    Console.ReadLine();
  }

  static void bw_DoWork (object sender, DoWorkEventArgs e)
  {
    for (int i = 0; i <= 100; i += 20)
    {
      if (_bw.CancellationPending) { e.Cancel = true; return; }
      _bw.ReportProgress (i);
      Thread.Sleep (1000);      // Just for the demo... don't go sleeping
    }                           // for real in pooled threads!

    e.Result = 123;    // This gets passed to RunWorkerCompleted
  }

  static void bw_RunWorkerCompleted (object sender,
                                     RunWorkerCompletedEventArgs e)
  {
    if (e.Cancelled)
      Console.WriteLine ("You canceled!");
    else if (e.Error != null)
      Console.WriteLine ("Worker exception: " + e.Error.ToString());
    else
      Console.WriteLine ("Complete: " + e.Result);      // from DoWork
  }

  static void bw_ProgressChanged (object sender,
                                  ProgressChangedEventArgs e)
  {
    Console.WriteLine ("Reached " + e.ProgressPercentage + "%");
  }
}

Reference

答案 1 :(得分:3)

游戏的方式是制作两种不同的应用程序。一个不是真正的加载屏幕,而是一个检查更新,显示新闻和启动游戏的启动器。第二个应用程序是它自己的游戏。如果你在C#中执行此操作,启动器可以通过调用以下方式启动游戏:

System.Diagnostics.Process.Start("[APPLICATION_PATH]");

答案 2 :(得分:2)

这很简单。您需要通过ShowDialog而不是Show来显示此表单。并在调用Hide之后在另一个线程中执行'some stuff'。这是我首先想到的:

void DoSomeStuff ()
{
  //Showing splash screen
  SplashForm.ShowDialog(this);
  new Thread (()=>
  {
    //do stuff what you need
    //Hiding splash screen
    SplashForm.Invoke (new Action (SplashForm.Hide));
  }).Start();
}

顺便说一下,有超过9000种方法可以做到这一点......)