【发布时间】:2018-04-12 00:44:13
【问题描述】:
假设我有一个 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 吗?
【问题讨论】: