Допустим, у меня есть ViewModel, которая может быть уничтожена, когда пользователь уходит от связанного View. Деструктор выполняет очистку переменной члена подписки:
MyViewModel::~MyViewModel()
{
if (m_subscription)
{
if (m_contentChangedToken.Value != 0)
{
m_subscription->ContentChanged -= m_contentChangedToken;
m_contentChangedToken.Value = 0;
}
}
}
После создания ViewModel запускается функция, которая асинхронно получает подписку, назначает ее переменной-члену и назначает прослушиватели событий.
void MyViewModel::AwesomeFunctionAsync()
{
create_task(TargetedContentSubscription::GetAsync(c_subId))
.then([this](TargetedContentSubscription^ subscription)
{
if (subscription)
{
m_subscription = subscription;
m_contentChangedToken = m_subscription->ContentChanged += // attach event
}
}, task_continuation_context::use_arbitrary());
}
Теперь предположим, что моя ViewModel уничтожается, пока фоновый поток выполняет код внутри AwesomeFunctionAsync. Здесь скрывается состояние гонки? Например, может ли деструктор запуститься до того, как событие будет присоединено фоновым потоком? Или я могу верить, что деструктор всегда будет последним из-за GC?