ホームページ >バックエンド開発 >C++ >別のクラスのバックグラウンド スレッドから UI を安全に更新するにはどうすればよいですか?

別のクラスのバックグラウンド スレッドから UI を安全に更新するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-05 19:34:40486ブラウズ

How to Safely Update a UI from a Background Thread in Another Class?

別のクラスのバックグラウンド タスクから 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。