別のクラスのバックグラウンド タスクから UI を更新する方法
バックグラウンド タスクは、UI をフリーズさせることなく、時間のかかる操作を実行できます。ただし、これらのタスクから UI を更新するには、クロススレッド メカニズムが必要です。この記事では、イベントとデリゲートを使用してこれを実現する方法について説明します。
イベントとデリゲートの使用
バックグラウンド スレッドから UI を更新するには、イベントとデリゲートを使用できます。特定のイベントが発生するとイベントが発生し、サブスクライバーはそれに応じて事前定義されたコードを実行できます。デリゲートは、別のスレッドで呼び出すことができるメソッドを表します。
イベントベースのアプローチ
このアプローチでは、UI が必要なときにバックグラウンド スレッドがイベントを発生させます。更新されました。メインスレッドはこのイベントをサブスクライブし、適切な UI 更新コードを実行します。以下に例を示します。
class MainWindow : Window { private void startCalc() { // ... CalcClass calc = new CalcClass(); calc.ProgressUpdate += (s, e) => { Dispatcher.Invoke((Action)delegate() { /* Update UI */ }); }; Thread calcthread = new Thread(new ParameterizedThreadStart(calc.testMethod)); calcthread.Start(input); } } class CalcClass { public event EventHandler ProgressUpdate; public void testMethod(object input) { // ... if (ProgressUpdate != null) ProgressUpdate(this, new YourEventArgs(status)); // ... } }
タスクベースのアプローチ (C# 4.5 以降)
もう 1 つのオプションは、非同期操作を表すタスクを使用することです。タスクは Task.Run メソッドを使用して作成でき、別のスレッドでコードを実行するクリーンな方法を提供します。
class MainWindow : Window { Task calcTask = null; void buttonStartCalc_Clicked(object sender, EventArgs e) { StartCalc(); } async void buttonDoCalc_Clicked(object sender, EventArgs e) { await CalcAsync(); } void StartCalc() { var calc = PrepareCalc(); calcTask = Task.Run(() => calc.TestMethod(input)); } Task CalcAsync() { var calc = PrepareCalc(); return Task.Run(() => calc.TestMethod(input)); } // ... } class CalcClass { public event EventHandler<EventArgs<YourStatus>> ProgressUpdate; public TestMethod(InputValues input) { // ... ProgressUpdate.Raise(this, status); // ... } }
結論
両方のイベント-ベースおよびタスクベースのアプローチを使用して、バックグラウンド スレッドから UI を更新できます。イベントベースのアプローチはよりシンプルですが、タスクベースのアプローチはより優れた制御とエラー処理を提供します。特定の要件に最も適したアプローチを選択してください。
以上が別のクラスのバックグラウンド スレッドから UI を安全に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。