委托和线程:CallbackContext参数

时间:2012-08-09 15:59:03

标签: c++ multithreading delegates windows-runtime workitem

我正在Metro模式下实现线程,我在谷歌搜索时得到了这个例子,但我不明白CallbackContext。这有什么用? This解释了它在MTA中的用法,但对我来说并不清楚。当我使用CallbackContext作为AnySame时,我遇到了问题。有些东西可以和其他东西一起使用!首先,我想知道这有什么用?! PS:我也是WindowsRT编程和C ++的新手!谢谢!

auto workItemHandler = ref new WorkItemHandler([=](IAsyncAction^)
{
    // Run the user callback.
    try
    {
        func(data);
    }
    catch (...)
    { 

    }
    // Signal that the thread has completed.
    SetEvent(completionEvent);
    //CloseHandle(completionEvent);

}, CallbackContext::Same);

1 个答案:

答案 0 :(得分:2)

CallbackContext确定您的委托(在本例中为WorkItemHandler)是否聚合了自由线程编组器。这将决定您的代表是否可以被走私到另一个公寓(CallbackContext::Any),或者是否必须将其召回原始公寓(CallbackContext::Same)。基本上,它告诉调用你的代表的人是否可以直接调用它而不管公寓,或者他们是否需要编组回到它所创建的公寓。

例如,在Windows应用商店应用中,修改UI的任何内容都需要在UI线程(STA)上运行。让我们假设您所处的方法是在UI线程上运行的方法(例如事件回调,如按钮单击处理程序)。某些异步调用(如ThreadPool::RunAsync)将在线程其他上运行传入的委托而不是UI线程(作为委托的默认值为CallbackContext::Any)。如果您不需要在UI线程上执行任何操作,这很有用,因为它可以释放该线程以继续传送消息(并且您的应用程序继续感觉性能)。

但是,如果您确实需要修改UI或回调到UI,并且尝试从非UI线程执行此操作,则会出现错误的线程异常。通过添加参数CallbackContext::Same,您可以强制您的委托在原始公寓(在此方案中为STA)中运行,从而避免出现问题。

(你也可以通过使用Dispatcher->RunAsync调用另一个代表在STA上运行来回调UI线程。你的整个代表是否更好地在STA上运行取决于你的场景。)