0

ロードにかなりの時間がかかるプログラムを作成しています (5 ~ 30 秒)。ユーザーが何かが行われていることを知るために、マーキー スタイルのプログレス バーで始まるフォームが必要です。

public FrmMain()
{
     var loading = new FrmLoading();
     loading.Show();

     InitializeComponent();

     // other start up code here

     loading.Close()
}

今、loadingうまくポップアップします。問題は、ラベルとプログレス バーが何も表示されず、ほとんどクラッシュしているように見えることです。を調べましたBackgroundWorkerが、正直なところ、それを機能させる方法を完全には理解していません。次のチュートリアルと例に従ってみました。

しかし、私の頭はそれを把握していません。フォームを適切にロードする他の方法はありますか? 助けてくれてありがとう。

編集

私のBackgroundWorker試みには、で実行されたすべてのアクションを実行する関数を作成することが含まれていましたFrmMain。だから、私は持っていました:

public FrmMain()
{
    Loading = new FrmLoading();
    Loading.Show();

    backgroundWorker1.RunWorkerAsync();
}

private void FormLoading()
{
     // Initialize and loading elements of the form
     InitializeComponent();
}
private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
{
    FormLoading();
}

private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Loading.Close();
}

しかし、私は乗り続けNullReferenceExceptionましたbackgroundWorker1.RunWorkerAsync();

4

3 に答える 3

1

ほとんど知られていない、または忘れられがちなフレームワーク ライブラリは、Microsoft.VisualBasic です。C# アプリで使用できます。Reference ... とこのクラスを追加するだけです。すべてのバックグラウンド ワーカー スレッドとその他を処理します。

public class MyApplication : WindowsFormsApplicationBase
{
    private static MyApplication _application;

    public static void Run(Form form)
    {
        _application = new MyApplication{ MainForm = form };
        _application.Run(Environment.GetCommandLineArgs());
    }

    protected override void OnCreateSplashScreen()
    {
        this.SplashScreen = new MySplashScreenForm();
    }
}

最後に、Program.Main() の下のアプリの起動を次のように変更します。

Application.Run(new Form1());

   MyApplication.Run(new Form1());

慣れていない場合、このクラスは、一見の価値がある単一インスタンス処理などの機能も提供します。

于 2012-11-08T18:21:44.333 に答える
0

私がやったことはエレガントではないかもしれませんが、必要なことは達成しました。

public FrmMain()
{    
     InitializeComponent();

     backgroundWorker1.RunWorkerAsync();

     var loading = new FrmLoading();
     loading.ShowDialog();
}

private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
{
    DbQuery();
}

private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Loading.Close();
}

これにより、loadingフォームが表示され、フォーカスがあり、完全に読み込まれます。を呼び出すDoWork前に を呼び出したShowDialog()ので、 はBackgroundWorker引き続き動作します。が完了DbQuery()すると、 が呼び出され、BackgroundWorker1RunWorkerCompleted()my が閉じFrmLoadingられ、プログラムが続行されます。投稿してくれたみんなに感謝します。

于 2012-11-08T22:03:54.037 に答える
0

おそらくこれが役立ちます:

追加:

Shown += new EventHandler(Form1_Shown);

あなたの後InitializeComponent();

そして追加:

void Form1_Shown(object sender, EventArgs e)
{
    Refresh();
}

また、デザイナーでイベント ハンドラーをサブスクライブしていない場合はBackgroundWorker1DoWork、以下を追加する必要があります。

backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
于 2012-11-08T20:28:27.053 に答える