4

我使用 Visual c++ 并发运行时创建了一个任务,然后在其上安排了四个延续

#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

通常,您可以使用 控制继续执行的上下文task_continuation_context,如MSDN 文档所述。但是,相同的文档还提到:

仅在 Windows 应用商店应用程序中使用此类才有用。对于非 Windows 应用商店应用程序,任务延续的执行上下文由运行时确定,并且不可配置。

从您的代码片段看来,当您使用并发运行时时,您并没有从 Windows 应用商店应用程序中使用它。因此,上下文实际上总是任意的。

还有一个问题是,为什么要在与第一个任务相同的线程上显式地运行后续任务:为什么不把这些任务的代码放在第一个任务中呢?延续的重点是回到特定线程以继续在后台任务中完成的工作 - 这意味着,第一个任务必然是您希望执行的后台工作,并且延续从main,启动线程。如果您希望留在后台线程上,请留在那里,不要费心继续进行这项工作。(但是,如上所述,由于这不是 Windows 应用商店应用程序,所有这些延续和任务都在任意上下文中运行;运行时将只选择一个可用线程

于 2015-07-07T04:31:22.457 回答