gpt4 book ai didi

c++ - 委托(delegate)和线程 : CallbackContext parameter

转载 作者:行者123 更新时间:2023-11-28 03:33:27 27 4
gpt4 key购买 nike

我在 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);

最佳答案

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com