0

I'm implementing threading in Metro mode, I got this example while Googling, but I don't understand CallbackContext . What's the use of this? This explains its use in MTA, but not clear to me. And I'm facing problem when I use CallbackContext as Any or Same. Something work with one but not with other! So first thing first I want to know what's the use of this?! PS: I'm new to WindowsRT programming and C++ too! Thanks!

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);
4

1 回答 1

2

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

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

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

(您还可以通过Dispatcher->RunAsync调用进一步的委托在 STA 上运行来回调 UI 线程。整个委托是否更好地在 STA 上运行取决于您的方案。)

于 2012-08-14T16:00:53.987 回答