2011-07-05 28 views
1

Webサーバーのデータにアクセスする際にc#とデータベースを使用してアプリケーションを作成していますが、非常に遅く、データがロードされるまでフォームもハングアップします。最初にフォームとデータをロードする方法は?データから独立したUIを読み込む方法

答えて

3

これを解決する一般的な方法は、BackgroundWorkerクラスを使用することです。

public void InitBackgroundWorker() 
{ 
    backgroundWorker.DoWork += YourLongRunningMethod; 
    backgroundWorker.RunWorkerCompleted += UpdateTheWholeUi; 

    backgroundWorker.WorkerSupportsCancellation = true; // optional 

    // these are also optional 
    backgroundWorker.WorkerReportsProgress = true; 
    backgroundWorker.ProgressChanged += UpdateProgressBar; 
} 

// This could be in a button click, or simply on form load 
if (!backgroundWorker.IsBusy) 
{ 
    backgroundWorker.RunWorkerAsync(); // Start doing work on background thread 
} 

// ... 

private void YourLongRunningMethod(object sender, DoWorkEventArgs e) 
{ 
    var worker = sender as BackgroundWorker; 

    if(worker != null) 
    { 
     // Do work here... 
     // possibly in a loop (easier to do checks below if you do) 

     // Optionally check (while doing work): 
     if (worker.CancellationPending == true) 
     { 
      e.Cancel = true; 
      break; // If you were in a loop, you could break out of it here... 
     } 
     else 
     { 
      // Optionally update 
      worker.ReportProgress(somePercentageAsInt); 
     } 

     e.Result = resultFromCalculations; // Supports any object type... 
    } 
} 

private void UpdateProgressBar(object sender, ProgressChangedEventArgs e) 
{ 
    int percent = e.ProgressPercentage; 
    // Todo: Update UI 
} 

private void UpdateTheWholeUi(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled) 
    { 
     // Todo: Update UI 
    } 
    else if (e.Error != null) 
    { 
     string errorMessage = e.Error.Message; 
     // Todo: Update UI 
    } 
    else 
    { 
     object result = e.Result; 
     // Todo: Cast the result to the correct object type, 
     //  and update the UI 
    } 
} 
+0

は、.NET 4では、あなたはまた、[TPL 'Task'クラス](http://stackoverflow.com/questions/3513432/task-parallel-library-replacement-for-backgroundworkerをチェックアウトすることができます) –

2

マルチスレッドが聞こえますか?例としてthisthisを参照してください。

1

他のthreadのデータをUI threadに取り込めませんでした。このようにして、UIが邪魔になることはありません。この投稿はthreadingを説明しています。 コントロールが作成されたスレッド以外のスレッドからコントロールを更新できないことに注意してください。これを解決するには、postをご覧ください。

1

どのようなデータを使用しますか?

あなたはBackgroundWorkerのを使用することができますまたはいくつかのケースでは非同期メソッドがあります(あなたがwebservivceを呼び出した場合、たとえば)

2

をマルチスレッドはあなたのために懸命にある場合は、最初にそのデータの一部をロードすることができ、かつフォームにいくつかのボタンを配置して、ユーザーがデータの他の部分をフェッチできるようにします。これは一般にオンデマンドローディングと呼ばれ、ページングと呼ばれる実装時に呼び出されます。あなたが10000レコードの情報を持っていると想像してください。最初の100個のレコードをロードして、ユーザーが2番目の100個のレコードをロードできるようにします。サーバー上の長い操作や問題がオンデマンドローディングではない場合、唯一の方法はスレッドを使用することです。

関連する問題