如何从 UI 线程访问工作线程?

how to access a worker thread from UI thread?

我在整个运行时都有一个工作线程 运行,它生成事件。

我可以使用 disp = Windows::UI::Core::CoreWindow::GetForCurrentThread()->Dispatcher.

在 UI 线程中处理这些事件

更准确地说,我通过在工作线程内的任何位置使用 disp->RunAsync(...) 对 UI 进行修改。

但我不知道如何进行反转操作。当我点击某个按钮时,我想在 UI 线程中有一些异步函数来在工作线程中执行操作(在某些 std::unique_ptr 上)。

如果我理解正确,您希望能够 运行 在单击按钮时执行异步操作,但是在您称为工作线程的特定线程上。

首先 - 因为你想在 2 个线程中使用一个资源,所以你不应该使用 unique_ptr 而应该使用 shared_ptr,因为你在两个线程之间共享这个资源。

其次 - 如果您不一定要 运行 特定线程上的操作,那么您可以简单地使用 Windows::System::Threading::ThreadPool::RunAsync 并捕获 shared_ptr 值.

例如:

namespace WST = Windows::System::Threading;

WST::ThreadPool::RunAsync(
    ref new WST::WorkItemHandler(
            [mySharedPtr](Windows::Foundation::IAsyncAction^ operation)
            {
                mySharedPtr->Foo();
            }));

如果您必须 运行 特定线程上的操作,那么我假设您希望能够将操作附加到已经 运行ning 线程,否则您将创建一个线程并且你可以使用上面的例子。 因此,为了将操作附加到已经 运行ning 的线程,该线程必须具有获取新操作的功能,然后 运行ing 这些操作以同步顺序进行。此功能基本上是 Dispatcher 提供的功能。这就是 Event Loop,也称为:消息调度程序、消息循环、消息泵或 运行 循环。您还可以通过阅读 Recator\Proactor 设计模式来查找信息。

This CodeProject页面显示了一种实现模式的方法,您可以使用Winrt组件使其更好\更方便\更熟悉