这个线程在C ++ / CX中的工作原理是什么?

时间:2013-03-11 03:01:36

标签: c++-cx

以下是代码:

//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开始标记的语句是以何种顺序和时间执行的?

在lambda表达式中,task2参数从哪里接收值(在语句2上面)?

A和B标记的内容是做什么的?他们之间有什么区别?

1 个答案:

答案 0 :(得分:2)

在方法的当前实现中,语句1将首先运行。这基本上是创建一个新对象WorkItemHandler,它封装了包含语句2,3,4和A的lambda。

但是,显示的代码中没有任何内容会导致执行此lambda,因此在任何时候都不会执行语句2,3,4或A.

将执行的下一个语句是5,它将调度task2(其定义我看不到)在线程池线程上运行。接下来将执行语句6或任务2,因为这些发生在不同的线程上,这可能是异步发生的。

语句A导致创建的DispatchedHandler(包含lambda封装语句4)在STA(UI)线程上运行。这是将回调编组回UI线程的一种方法,如果语句4将修改UI绑定类上的某些UI或调用方法,则这是必需的。未能编组回UI线程可能导致WrongThreadException。

语句B导致task2在ThreadPool线程上运行。与UI线程不同,这是一个任意的工作线程,它将位于多线程单元(MTA)中。这适用于您不需要访问或修改UI的情况(例如,执行计算密集型处理)。