以下是代码:
//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标记的内容是做什么的?他们之间有什么区别?
答案 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的情况(例如,执行计算密集型处理)。