如果我理解正确,您希望能够在单击按钮时运行异步操作,但在您引用为您的工作线程的特定线程上运行异步操作。
首先 - 既然您想在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();
}));
如果你必须在一个特定的线程那么我想你希望能够追加操作已经运行的线程中运行操作,否则你正在创建一个线程,你可以使用上面的例子。 因此,为了将操作附加到已经运行的线程上,该线程必须具有获取新操作然后以同步顺序运行这些操作的功能。这个功能基本上是Dispatcher提供的。这就是所谓的Event Loop,也称为:消息分派器,消息循环,消息泵或运行循环。您也可以通过阅读Recator \ Proactor设计模式来查找信息。
This CodeProject页面显示实现模式的一种方式,并且可以使用WinRT的组成部分,使之更好\更conveniant \更熟悉
UI线程是特殊的,它有一个解决[生产者 - 消费者调度员问题](https://en.wikipedia.org/wiki/Producer%E2%80%93consumer_problem)。它允许你在该线程上运行代码。如果你想在工作线程上做到这一点,那么你需要解决同样的问题。线程安全队列是必需的。 –