C ++ / WinRT: Могу ли я ожидать один дескриптор IAsyncAction от нескольких вызовов сопрограмм? - PullRequest
2 голосов
/ 21 марта 2020

У меня есть сопрограмма IAsyncAction Foo, которая будет вызываться один раз в начале моей программы.

У меня также есть сопрограмма IAsyncAction Bar, которая будет вызываться несколько раз, произвольно, и должна ждать Foo в какой-то момент.

Могут ли множественные вызовы на Bar ждать одного вызова Foo, как это?

IAsyncAction m_fooAction = Foo();

(Позже, в пределах Bar ...)

co_await m_fooAction;

Я пытался это сделать, но получаю сообщение об ошибке: A delegate was assigned when not allowed (см. https://docs.microsoft.com/en-us/uwp/cpp-ref-for-winrt/error-handling/hresult-illegal-delegate-assignment).

Обратите внимание: эта разработка предназначена для Windows 8 настольных приложений, поэтому не может использовать CoreDispatcher или DispatcherQueue.

1 Ответ

1 голос
/ 21 марта 2020

По мнению авторов C ++ / WinRT, IAsyncAction и аналогичные интерфейсы могут иметь только одного ожидающего.

В качестве альтернативы они рекомендуют использовать дескриптор ядра. https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/concurrency-2#awaiting -a-kernel-handle

Обновление: от Раймонда Чена (MSFT):

Possible workarounds:

1. Write your own custom object that supports multi-awaiting.
2. Use an existing object that supports multi-awaiting (such as `Concurrency::task`).
3. Use a kernel handle and `resume_on_signal`.

Option 3 is probably simplest.

Вариант 3 работал для моего случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...