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 的语句以什么顺序和何时执行?

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

标记为 A 和 B 的语句是做什么的?它们之间有什么区别?

4

1 回答 1

2

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

但是,显示的代码中的任何内容都不会导致执行此 lambda,因此语句 2、3、4 或 A 绝不会执行。

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

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

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

于 2013-03-19T20:13:31.713 回答