我在 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);
最佳答案
CallbackContext
确定您的委托(delegate)(在本例中为 WorkItemHandler
)是否聚合自由线程编码器。这将确定您的委托(delegate)是否可以被偷运到另一个公寓(CallbackContext::Any
),或者是否必须将其回调到原始公寓(CallbackContext::Same
) .基本上,它告诉调用您的委托(delegate)的人是否可以直接调用它而不考虑公寓,或者他们是否需要编码回创建它的公寓。
例如,在 Windows 应用商店应用程序中,任何修改 UI 的内容都需要在 UI 线程 (STA) 上运行。假设您所在的方法是在 UI 线程上运行的方法(例如事件回调,如按钮单击处理程序)。某些异步调用,如 ThreadPool::RunAsync
将在 UI 线程以外的线程上运行传入的委托(delegate)(因为委托(delegate)的默认值是 CallbackContext::任何
)。如果您不需要在 UI 线程上执行任何操作,这将非常有用,因为它可以释放该线程以继续发送消息(并且您的应用程序会继续保持高性能)。
但是,如果您确实需要修改 UI 或对 UI 进行回调,并且您尝试从非 UI 线程执行此操作,则会收到不正确的线程异常。通过添加参数 CallbackContext::Same
,您可以强制您的委托(delegate)在原始单元(在本例中为 STA)中运行,从而避免该问题。
(您还可以通过使用 Dispatcher->RunAsync
调用另一个委托(delegate)在 STA 上运行来回调 UI 线程。整个委托(delegate)在 STA 上运行是否更好STA与否取决于你的场景。)
关于c++ - 委托(delegate)和线程 : CallbackContext parameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11887343/