0

私は Metro モードでスレッド化を実装しています。Google でこの例を取得しましたが、理解できませんCallbackContext。これの用途は何ですか?これは MTA での使用を説明していますが、私にはわかりません。CallbackContextそして、 asAnyまたはを使用すると問題に直面していますSame。あるものでは機能しますが、他のものでは機能しません! まず最初に、これの用途を知りたいですか?! PS: 私は WindowsRT プログラミングと C++ も初めてです。ありがとう!

auto workItemHandler = ref new WorkItemHandler([=](IAsyncAction^)
{
    // Run the user callback.
    try
    {
        func(data);
    }
    catch (...)
    { 

    }
    // Signal that the thread has completed.
    SetEvent(completionEvent);
    //CloseHandle(completionEvent);

}, CallbackContext::Same);
4

1 に答える 1

2

CallbackContextデリゲート (この場合は a WorkItemHandler) がフリースレッド マーシャラーを集約するかどうかを決定します。これにより、デリゲートを別のアパートに密輸できるか ( CallbackContext::Any)、元のアパートに呼び戻す必要があるか( ) が決まりますCallbackContext::Same。基本的に、デリゲートを呼び出す人に、アパートメントに関係なく直接呼び出すことができるかどうか、またはデリゲートが作成されたアパートメントにマーシャリングする必要があるかどうかを伝えます。

たとえば、Windows ストア アプリケーションでは、UI を変更するものはすべて UI スレッド (STA) で実行する必要があります。現在のメソッドが、UI スレッドで実行されるメソッド (ボタン クリック ハンドラーのようなイベント コールバックなど) であると仮定しましょう。のような特定の非同期呼び出しはThreadPool::RunAsync、渡されたデリゲートをUI スレッド以外のスレッドで実行します (デリゲートのデフォルトは です)CallbackContext::Any。これは、UI スレッドで何もする必要がない場合に役立ちます。これにより、そのスレッドが解放されてメッセージのポンピングを続行できるようになります (そして、アプリのパフォーマンスが向上し続けます)。

ただし、UI を変更したり、UI にコールバックしたりする必要があり、UI 以外のスレッドからそれを行おうとすると、正しくないスレッド例外が発生します。パラメーターCallbackContext::Sameを追加することで、デリゲートを元のアパートメント (このシナリオでは STA) で強制的に実行することで、問題を回避できます。

( を使用して、さらにデリゲートを呼び出して STA で実行することにより、UI スレッドにコールバックすることもできますDispatcher->RunAsync。デリゲート全体を STA で実行する方がよいかどうかは、シナリオによって異なります。)

于 2012-08-14T16:00:53.987 に答える