我正在Metro模式下实现线程,我在谷歌搜索时得到了这个例子,但我不明白CallbackContext
。这有什么用? This解释了它在MTA中的用法,但对我来说并不清楚。当我使用CallbackContext
作为Any
或Same
时,我遇到了问题。有些东西可以和其他东西一起使用!首先,我想知道这有什么用?! 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);
答案 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上运行取决于你的场景。)