4

ビジュアル C++ コンカレンシー ランタイムを使用してタスクを作成し、その上で 4 つの継続をスケジュールしました

#include <iostream>
#include <thread>
#include <ppltasks.h>

int main()
{
    concurrency::create_task([]
    {
        std::cout << std::this_thread::get_id() << std::endl;
    })
    .then([]
    {
        std::cout << std::this_thread::get_id() << std::endl;
    })
    .then([]
    {
        std::cout << std::this_thread::get_id() << std::endl;
    })
    .then([]
    {
        std::cout << std::this_thread::get_id() << std::endl;
    })
    .then([]
    {
        std::cout << std::this_thread::get_id() << std::endl;
    });

    std::cin.get();
}

これにより、次の出力が出力されます

29432
29432
25096
25668
42488

4 つの継続が最初のタスクと同じスレッドでスケジュールされていないことに注意してください。最初のタスクと同じスレッドで継続をスケジュールする方法はありますか? TaskContinuationOptions.ExecuteSynchronouslyオプションを使用することで、C# でこれが可能になると思います。

4

1 に答える 1

0

通常、継続が実行されるコンテキストは、MSDN のドキュメントで説明さtask_continuation_contextれているように、 を使用して制御できます。ただし、同じドキュメントには次のことも記載されています。

このクラスは、Windows ストア アプリからのみ使用できます。Windows ストア以外のアプリの場合、タスク継続の実行コンテキストはランタイムによって決定され、構成することはできません。

コード スニペットから、コンカレンシー ランタイムを使用している間は、Windows ストア アプリからは使用していないようです。したがって、コンテキストは実質的に常に恣意的なものになります。

また、最初のタスクと同じスレッドで後続のタスクを明示的に実行する理由についても質問があります。最初のタスク内にこれらのタスクのコードを配置しないのはなぜですか? 継続のポイントは、バックグラウンド タスクで完了した作業を続行するために特定のスレッドに戻ることです。つまり、最初のタスクは必ず実行したいバックグラウンド作業であり、継続はその作業に対してメインの開始スレッド。バックグラウンド スレッドにとどまりたい場合は、そこにとどまり、その作業を継続して行う必要はありません。(ただし、前述のように、これは Windows ストア アプリではないため、これらの継続とタスクはすべて任意のコンテキストで実行されます。ランタイムは、'

于 2015-07-07T04:31:22.457 に答える