0

私はc#winformsを介してプロジェクトを開発しています。フォーム間の移動に問題があります。

クラシックフォームナビゲーションを使用しています。

メインフォームのボタンをクリックすると、たくさんのアイテムが入った新しいフォームが開きます。

これが私が使ったコードです。

frmMuayAnaEkran frm = new frmMuayAnaEkran();
frm.ShowDialog();

そのため、フォームの作成が遅すぎるという問題がありました。本当に、開くのに8-10​​秒かかりました。この問題を解決するにはどうすればよいですか?これが私が開きたいフォーム画面です:http://j.mp/VRMyby

4

2 に答える 2

4

問題は、フォームコンストラクター内またはFormCreatedイベント内でいくつかの高価な操作を実行しているという事実に起因していると思います。データベースまたは一部のリモートサービスにクエリを実行している可能性があります。あなたが考えるかもしれないいくつかのことがあります:

  • バックグラウンドスレッドで高価な操作を実行します。たとえば、BackgroundWorkerを使用できます。これにより、データの表示が速くなることはありません。フォームがすぐに表示され、データが後で表示され、メインUIがブロックされないため、ユーザーエクスペリエンスが向上します。
  • コストのかかる操作を最適化します。たとえば、SQLクエリを実行している場合、SQLプロファイラーを調べて、それらのクエリを何らかの方法で最適化できるかどうかを確認できます。一部の列にインデックスを付けることで、SQLクエリをどれだけ高速に実行できるかは驚くべきことです。データをフェッチするためにHTTPリクエストを実行している場合は、それらのリクエストの数を減らすことができるかどうかを考えることができます。通常、小さなデータを含む多くのリクエストよりも、より多くのデータをネットワーク経由で返すリクエストを少なくする方が適切です。
  • コストのかかる操作の結果をメモリ内にキャッシュして、次にユーザーが同じフォームを開いたときに、それらの結果を取得するためにそれほど待つ必要がないようにすることができます。
  • アプリケーションのアーキテクチャとナビゲーションワークフローによっては、ユーザーが実際にフォームに移動する前に、一部のデータのプリロードを開始できます。もちろん、メインワーカースレッドがフリーズしないように、バックグラウンドスレッドでもう一度実行する必要があります。
于 2012-12-31T07:30:33.027 に答える
1

フォームの読み込み時に次のことを行う必要があるとします。

void LoadStartupItemsAndDataBlahBlah(object sender, DoWorkEventArgs e)
{
    int s = 0;
    for (int i = 0; i < 1000; i++)
        for (int j = 0; j < 1000; j++)
            for (int k = 0; k < 1000; k++)
               s++;
    MessageBox.Show(s.ToString());
}

フォームロードでこのメソッドを呼び出す場合

private void Form5_Load(object sender, EventArgs e)
{
    Stopwatch t = new Stopwatch();
    t.Start();
    LoadStartupItemsAndDataBlahBlah(null,null);
    t.Stop();
    this.Text = string.Format("[{0}] mili-seconds", t.ElapsedMilliseconds);
}

フォームは約5秒(5000ミリ秒)後に実行され、メッセージボックスが表示されます1000000000

ただし、メソッドをバックグラウンドで実行する場合

private void Form5_Load(object sender, EventArgs e)
{
    BackgroundWorker bg = new BackgroundWorker();
    bg.DoWork += new DoWorkEventHandler(LoadStartupItemsAndDataBlahBlah);
    Stopwatch t = new Stopwatch();
    t.Start();
    bg.RunWorkerAsync();
    t.Stop();
    this.Text = string.Format("[{0}] mili-seconds", t.ElapsedMilliseconds);
}

フォームは約0〜1ミリ秒で非常に高速に読み込まれ、5秒でメッセージボックスが到着してその値が表示されます1000000000

于 2012-12-31T07:50:59.973 に答える