2

データベースクエリ、データグリッドのカスタマイズ、および大量のデータの読み込みが原因で、最初のウィンドウの読み込みに3〜5秒かかる古いwinformsアプリケーションを維持しています。

これには、ユーザーがこの古いウィンドウとまだ実装されていない新しい機能を選択できるフロント スクリーンを追加することになっています。

そこで、db クエリやその他の古いコードの一部をリファクタリングすることに加えて、次のようにして、このウィンドウの読み込み時間を改善したいと考えています。

  1. ユーザーがフロント画面に入る
  2. ロードが遅いウィンドウは、現在と同じようにロードを開始しますが、フロント スクリーン ウィンドウがアクティブな間、非表示になり、別のスレッドのバックグラウンドに表示されます。ユーザーが実際にボタンをクリックしてウィンドウを開く前にウィンドウが完全にロードされた場合でも、非表示のままにする必要があります。
  3. ユーザーがボタンをクリックしてウィンドウを開くと、既に読み込まれて準備が整っているため、すぐに表示されます。

これは私が持っているものです:

private void startBackgroundLoading()
{
var myThread = new Thread(openSlowLoadingWindow);
myThread.SetApartmentState(ApartmentState.STA);
myThread.Start();
}

private void openSlowLoadingWindow()
{
System.Windowns.Forms.Application.Run(new SlowWindow());
}

上記の 2 つのウィンドウ (フロントスクリーンとスローローディング) が別々のプロジェクトにあるため、Application.Run() を使用しています。

明らかに、上記のコードは新しいスレッドを開始し、ロードが完了するとウィンドウを表示しますが、上で説明したように、実際に表示するタイミングを伝えたいと思います。

新しいスレッドをバックグラウンドで実行したり、ウィンドウを非表示にしたり、その他のさまざまなことを行う方法をいくつか試しました。

私はプログラミングに比較的慣れていないので、これを完全に間違った角度から攻撃している場合は、どうすれば改善できるか教えてください。

私は .net 4.0 に縛られているので、新しい async/await はオプションではありません。

よろしく、 エリック

4

2 に答える 2

1

並列スレッドで読み込みが遅いウィンドウを作成して (実行はせずに)、必要なときにこのウィンドウを表示したことがありますか?

これは、データベース呼び出しと、ウィンドウの表示が遅いという側面がウィンドウのコンストラクターにあるシナリオで機能します。

于 2012-06-21T13:47:05.710 に答える
0

このイベント ハンドラーをスロー フォームに追加してみることができます。

    private void SlowWindow_Shown(object sender, EventArgs e)
    {
        Hide();
    }

そして、このメソッドをフロントスクリーンから呼び出すように追加します:

    public void ShowCrossThread()
    {
        this.Invoke(new Action(() => { Show(); }));
    }

次に、フロント画面で次のことを行う必要があります。

    SlowForm _slowForm;

    private void openSlowLoadingWindow()
    {
        _slowForm = new SlowForm();
        System.Windows.Forms.Application.Run(_slowForm);
    }

    private void btnSlowForm_Click(object sender, EventArgs e)
    {
        _slowForm.ShowFromThread();
        Hide();
    }
于 2012-06-22T08:26:49.247 に答える