2010-11-25 17 views
1

私のアプリケーションにはいくつかのWinFormがあります。.NET Compact FrameworkのUIを改善する方法、C#

何らかの形で、表示するデータが多い他のフォームを読み込んでいます。

だから、

私はロードするために、彼らが取るこれらのフォームをロードするために9-10秒ボタンをクリックし、

私はこれを改善ワナ。私はバックグラウンドスレッドについて聞いたことがありますが、これを使う方法は分かりません。

ボタンをクリックすると、フォームがすぐに表示され、処理がバックグラウンドスレッドで実行されるようにするにはどうすればよいですか?

私はUIを改善できるように案内してください。

答えて

0

フォームがすぐに表示されるようにするには、かなり簡単で、バックグラウンドスレッドは必要ありません。

私の推測では、フォームを読み込む前にすべてのデータを取得しているか、フォームを読み込む同じスレッドでデータを取得していると思います。残りのデータ(IDなど)を取得するために必要なデータをフォームに呼び出すことができます。

次に、フォームを作成するスレッド以外のスレッドでデータ処理を行う方法を見つけるだけで済みます。

これは最も洗練された解決策ではないかもしれませんが、それは仕事を完了します。それはあなたが取得しているデータのいくつかのセットを持っている場合は、各セットを取得するために、タスクのキューの設定を検討することをお勧めしますSystem.Windows.Forms.Timer

private void Form1_Load(object sender, EventArgs e) 
    { 
     timer1.Start(); 
    } 

    private void timer1_Tick(object sender, EventArgs e) 
    { 
     timer1.Stop(); 
     //fill controls with data 
    } 

を使用しています。

あなたがやっている方法。データがロードされていない場合は、エラーを引き起こす可能性のあるボタン(またはその他のui)を必ず無効にしてください。

編集:winformコントロールは常にスレッドでうまくいくとは限りません。 System.Windows.Forms.TimerSystem.Timers.Timerとは対照的に)に関する素晴らしい点は、コントロールでうまくいくように設計されていることです。

0

BackgroundWorkerは使いやすいです。主にDoWorkイベントを購読します。これは、別のスレッドで実行される作業を配置する場所です。また、RunWorkerCompletedイベントを購読します。これは、DoWorkが完了したときに発生します。 このメソッドでは、単にDoWorkメソッドによってフェッチされたデータをバインドします。

DoWork eventargを使用して、DoWorkとRunWorkerCompletedの間でデータを渡すことができます。 また、作業をキャンセルすることもできます。また、RunWorkerCompleted eventArgを使用してDoWorkからデータを取得し、例外処理のErrorプロパティも調べることができます。

多くのデータがある場合は、バッチ処理を使用してバッチごとのデータを取得し、UIに表示できます。フェッチするレコードの総数と、1000件中100件がロードされたこと、1000件中200件がロードされたことなどを表示して、ユーザに通知します。ユーザーがフェッチを停止できるように、[キャンセル]オプションを指定することもできます。

ボタンをクリックするだけで、myBackgroundWorker.RunWorkerAsync()を呼び出すことができます。 これは、主UIスレッドではなく、別のスレッドで実行されるDoWork Handlerを呼び出します。そのため、UIはバックグラウンドワーカーDoWork中にフリーズしません。

バックグラウンドワーカーはレポートの進捗状況もサポートしています。

0

問題がメインフォームフリーズである場合、必要なのは、メインフォームが実行されているよりも分離されたスレッドでデータを収集することです。

はそれを実現するには、このような何かを行うことができます。

BackgroundWorker worker; 

    public Form1() 
    { 
     InitializeComponent(); 
     worker = new BackgroundWorker(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker.RunWorkerAsync(); 
    } 

    void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //Collect data and open your second form here; 
    }