0

かなり長いプロセスが実行されているため、しばらくの間アプリケーションがフリーズします。

このプロセスをバックグラウンドワーカーでラップして、ユーザーにステータスを提供するにはどうすればよいですか。

理想的には、プロセス自体が進行状況を報告する必要があることを知っていますが、それを組み込むことができるとは思いません。そのプロセスでコードを変更できないわけではありませんが、あまり変更したくありません。

アプリの応答性を維持できるように、バックグラウンドワーカーでプロセスを開始できれば幸いです。今、これは私ができる。しかし、問題は、プロセスがまだ実行中であることを示すためにプログレスバーに何かを実行させる簡単な方法はありますか?

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    StartLongRunningProcess();
}

私のコードは上記のようになりましたが、プログレスバーを更新できるようにプロセスをラップする方法を考えていましたか?または、コードを完全に変更せずに、このプロセスからより多くの情報を取得する簡単な方法はありますか?その長時間実行プロセス内には、変更された行カウンターが実行されていますが、値は終了時にのみ返されます。

backgroundworkerとそのReportProgressオプションがどのように機能するかは知っていますが、問題は、プロセスが実行されるだけで、実行中にフィードバックが提供されないことです。

4

2 に答える 2

2

WorkerReportsProgress プロパティを true に設定すると、ProgressChanged イベントを使用できます。

BackgroundWorker bw = new BackgroundWorker{WorkerReportsProgress = true}
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);

private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
   var percent = e.ProgressPercentage;
   //update progress bar here
}

その後、あなたの仕事で進捗状況を報告できます。

private void bw_DoWork(object sender, DoWorkEventArgs e)
{   
   BackgroundWorker worker = sender as BackgroundWorker;    
   e.Result = StartLongRunningProcess(worker);
}

public void StartLongRunningProcess(BackgroundWorker worker)
{
   worker.ReportProgress(percentComplete);
}

ここで完全な例を見つけることができます

于 2012-05-02T21:12:32.317 に答える
1

ワーカーを開始すると、メインの UI スレッドは自由に好きなことを行うことができます。その時点で、必要なアニメーションの表示を開始するか、タイマーまたはその他の必要なメカニズムを介して更新するだけです。ワーカーが完了したら、必ずアニメーションを停止/非表示にしてください。

于 2012-05-02T20:57:14.567 に答える