私はボタンをwinformでクリックすると、5秒間の処理が行われます。イベントとデリゲートを使用してUIへの進捗状況を更新する方法
このプロセス中に、進行状況(ProgressBar)をUIに更新し、完了した作業の割合を%にしたいとします。
イベントを使用してこれを行う方法&参加者?
他のアプローチも歓迎されています(イベント&代表者以外の)..以下
私はボタンをwinformでクリックすると、5秒間の処理が行われます。イベントとデリゲートを使用してUIへの進捗状況を更新する方法
このプロセス中に、進行状況(ProgressBar)をUIに更新し、完了した作業の割合を%にしたいとします。
イベントを使用してこれを行う方法&参加者?
他のアプローチも歓迎されています(イベント&代表者以外の)..以下
擬似コード。実際のProgressBarインターフェイスは私が覚えているものと少し異なる場合がありますので、コンパイラは手元にありません。
// service
delegate void ProgressDelegate(int CurrentValue, int MaxValue);
void BusinessProcess(ProgressDelegate progress)
{
// do something
progress(20, 100);
// do other things
progress(50, 100);
// do yet another thing
progress(100, 100);
}
// client
void Button1_Click(object sender, EventArgs e)
{
BusinessProcess(
(current, max) =>
{
this.ProgressBar1.Maximum = max;
this.ProgressBar1.Value = current;
this.ProgressBar1.Refresh();
}
);
}
これはプログレスバーに関する直接の質問を解決しますが、ButtonClickに対して5秒の処理を行うための_how_には対処しません。このプログラムはハングします。 –
'Application.DoEvents()'を追加したり、強制的にペンディングメッセージを処理したりすることはありません。だからこそ私はそれが部分的な解決であると述べました。 –
DoEvents()は、(潜在的な)他の問題のバケットを導入しています。スレッドが必要です。 –
処理中にアプリケーションを応答させたい場合は、BackgroundWorkerを使用します。 MSDNの記事BackgroundWorker Classを参照してください。進行状況を報告する方法を示すc#の例があります。
どのような研究を行っていますか?このトピックに関するMSDNのサンプルコードのページがあります。 – ChrisF
@ChrisF:イベントやデリゲートを理論的に使う方法はわかっていますが、このシナリオでは私はそれを実装する方法がわかりません。また、この特定のシナリオでどのように研究するのかもわかりません。 – dotNETbeginner
それは問題ありませんが、答えとして提供されたものを試してみたことが述べられていない限り、答えがない場合よりも悪い場合があります。 – ChrisF