私のアプリケーションでは、一連の初期化手順を実行する必要がありますが、完了するまでに 7 ~ 8 秒かかり、その間 UI が応答しなくなります。この問題を解決するには、別のスレッドで初期化を実行します。
public void Initialization()
{
Thread initThread = new Thread(new ThreadStart(InitializationThread));
initThread.Start();
}
public void InitializationThread()
{
outputMessage("Initializing...");
//DO INITIALIZATION
outputMessage("Initialization Complete");
}
についての記事をいくつか読みましたがBackgroundWorker
、長いタスクを実行するためにスレッドを記述しなくても、アプリケーションの応答性を維持できるはずだと書かれていましたが、実装に成功したことはありません。 を使用してこれをどのように実現するかを教えていただけますかBackgroundWorker
?
ベストアンサー1
使用して追加
using System.ComponentModel;
宣言するバックグラウンドワーカー:
private readonly BackgroundWorker worker = new BackgroundWorker();
イベントを購読する:
worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted;
次の 2 つのメソッドを実装します。
private void worker_DoWork(object sender, DoWorkEventArgs e) { // run all background tasks here } private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //update ui once worker complete his work }
必要なときにいつでもワーカーを非同期に実行します。
worker.RunWorkerAsync();
進捗状況を追跡する(オプションですが、役立つことが多いです)
a)
ProgressChanged
イベントを購読して使用ReportProgress(Int32)
するDoWork
b) セット
worker.WorkerReportsProgress = true;
(クレジット:@zagy)