вызовы чередуются:
веденном ниже примере вызов HandleChangesAsync выполняется из асинхронной задачи и через обработчик событий.
Вопрос - Есть ли способ гарантировать, что только один поток может одновременно выполнять блоки продолжения задачи HandleChangesAsync create_task + (даже если блоки продолжения задачи вызывают другие асинхронные функции)?
Обратите внимание, что я не могу просто использовать примитив синхронизации, потому что HandleChangesAsync может вернуться до завершения асинхронных операций.
void MyClass::DoStuffAsync()
{
WeakReference weakThis(this);
create_task(DoMoreStuffAsync())
.then([weakThis]())
{
auto strongThis = weakThis.Resolve<HomePromotionTemplateViewModel>();
if (strongThis)
{
strongThis->RegisterForChanges();
strongThis->HandleChangesAsync();
}
});
}
void MyClass::RegisterForChanges()
{
// Attach event handler to &MyClass::OnSomethingChanged
}
void MyClass::OnSomethingChanged()
{
HandleChangesAsync();
}
void MyClass::HandleChangesAsync()
{
WeakReference weakThis(this);
create_task(DoMoreCoolStuffAsync(m_needsProtection))
.then([weakThis]()
{
// do async stuff
// update m_needsProtection
})
.then([weakThis]()
{
, // do more async stuff
// update m_needsProtection
});
}