2

コードは次のとおりです。

//statement 1
auto task1 = ref new WorkItemHandler([&](IAsyncAction^ task2)
{
    //statement 2
    if (task2->Status == AsyncStatus::Canceled)
    {
            //statement 3
    }
    Dispatcher->RunAsync(CoreDispatcherPriority::High,    //statement A
            ref new DispatchedHandler(
            [=]()
    {
            //statement 4                                  
    }));
    }
);
//statement 5
IAsyncAction ^ thread = Windows::System::Threading::ThreadPool::RunAsync(task2);  //statement B
//statement 6

このスレッドの動作を知りたいです。

1〜6のラベルが付いたステートメントは、どのような順序でいつ実行されますか?

そしてラムダ式では、task2パラメーターはどこから値を受け取りますか(ステートメント2の上)?

AとBのラベルが付いたステートメントは何をしますか?それらの違いは何ですか?

4

1 に答える 1

2

メソッドの現在の実装では、ステートメント 1 が最初に実行されます。これは基本的に、ステートメント 2、3、4、および A を含むラムダをカプセル化する新しいオブジェクト WorkItemHandler の作成です。

ただし、示されているコードでは、このラムダが実行されることはありません。そのため、ステートメント 2、3、4、または A は実行されません。

実行される次のステートメントは 5 で、タスク 2 (その定義はわかりません) をスレッドプール スレッドで実行するようにスケジュールします。ステートメント 6 または task2 のいずれかが次に実行されます。これらは異なるスレッドで発生しているため、非同期で発生する可能性があります。

ステートメント A により、作成された DispatchedHandler (ラムダ カプセル化ステートメント 4 を含む) が STA (UI) スレッドで実行されます。これは、UI スレッドへのコール バックをマーシャリングする 1 つの方法です。これは、ステートメント 4 で一部の UI を変更するか、UI バインド クラスのメソッドを呼び出す場合に必要です。UI スレッドへのマーシャリングに失敗すると、WrongThreadException が発生する可能性があります。

ステートメント B により、task2 が ThreadPool スレッドで実行されます。UI スレッドとは異なり、これはマルチスレッド アパートメント (MTA) にある任意のワーカー スレッドです。これは、UI にアクセスしたり、UI を変更したりする必要がない場合に適しています (計算負荷の高い処理を実行するなど)。

于 2013-03-19T20:13:31.713 に答える