Webサーバーのデータにアクセスする際にc#とデータベースを使用してアプリケーションを作成していますが、非常に遅く、データがロードされるまでフォームもハングアップします。最初にフォームとデータをロードする方法は?データから独立したUIを読み込む方法
1
A
答えて
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
}
}
2
1
1
どのようなデータを使用しますか?
あなたはBackgroundWorkerのを使用することができますまたはいくつかのケースでは非同期メソッドがあります(あなたがwebservivceを呼び出した場合、たとえば)
2
をマルチスレッドはあなたのために懸命にある場合は、最初にそのデータの一部をロードすることができ、かつフォームにいくつかのボタンを配置して、ユーザーがデータの他の部分をフェッチできるようにします。これは一般にオンデマンドローディングと呼ばれ、ページングと呼ばれる実装時に呼び出されます。あなたが10000レコードの情報を持っていると想像してください。最初の100個のレコードをロードして、ユーザーが2番目の100個のレコードをロードできるようにします。サーバー上の長い操作や問題がオンデマンドローディングではない場合、唯一の方法はスレッドを使用することです。
関連する問題
- 1. テキストエリアにデータを読み込む方法
- 2. 外部JSONからのデータをカルーセルに読み込む方法
- 3. AppDelegate.mからTableViewデータを読み込む方法は?
- 4. sqliteテーブルからデータを読み込む方法は?
- 5. jsonパーサからデータを読み込む方法
- 6. Rubyでデータベースからデータを読み込む方法
- 7. テキストボックスからリストボックスにデータを読み込む方法は?
- 8. xmlからデータを読み込む
- 9. バーコードからデータを読み込む
- 10. MongoDBからデータを読み込む
- 11. ボタンをクリックして剣道UIからグラフを読み込む方法
- 12. テキストファイルから読み込むときにApache Ignite Cacheを読み込む方法
- 13. データを読み込むための最速の方法
- 14. 宣言されたディレクトリからファイルを読み込む方法
- 15. UWPはコードからUIデータを読み込みません
- 16. QTreeWidgetとPyQt:ファイルからデータを保存して読み込む方法
- 17. jquery UIダイアログでページを読み込む方法
- 18. QTでUIフォームを読み込む方法は?
- 19. Default.pngイメージの読み込みインジケータを読み込む方法
- 20. アップロードされたファイルからデータを読み込む
- 21. ファイルからJFrameを正しく読み込む方法は?
- 22. byte []を独立型ストレージに読み書きする方法
- 23. ユーザーコマンドでUI要素を読み込む
- 24. getScriptでjQuery UIを読み込む
- 25. 外部データを読み込むときにコンソールからXHRの読み込みが完了した
- 26. ajaxを使って他のウェブサイトからデータを読み込む方法は?
- 27. XMLドキュメントを読み込んで読み込む方法
- 28. ClojureのRandomAccessFileから正しく読み込む方法は?
- 29. C++の大きなテキストファイルから部分データを読み込む方法
- 30. CSVからSQLiteに一度Androidデータを読み込む方法は?
は、.NET 4では、あなたはまた、[TPL 'Task'クラス](http://stackoverflow.com/questions/3513432/task-parallel-library-replacement-for-backgroundworkerをチェックアウトすることができます) –