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

标签 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);

最佳答案

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/

相关文章:

C# 线程,如何让线程运行带有参数的方法?

C++ 线程 : cannot unlock mutex in array after condition_variable wait

java - 通过 executorservice 进行顺序事件处理

c# - 在 .NET 中,事件将在哪个线程中处理?

c++ - 跨平台的 C++ 控制台显示

c++ - 在递归数据结构中 move unique_ptr<T> 数组

c++ - qt图表等轴(轴应该形成正方形而不是矩形)

c++ - 如何清理杂乱的 main()?

ios - 当它们是两个 View 之间的导航 Controller 时,如何将 managedObjectContext 从 appDelegate 传递到第一个 ViewController

ios - 复杂的多线程应用程序的最佳网络解决方案是什么?