因此Task
在内部使用ManualResetEventSlim
内核同步 struct
internal ManualResetEventSlim CompletedEvent
{
get
{
ContingentProperties contingentProps = EnsureContingentPropertiesInitialized();
if (contingentProps.m_completionEvent == null)
{
bool wasCompleted = IsCompleted;
ManualResetEventSlim newMre = new ManualResetEventSlim(wasCompleted); // <----------------
if (Interlocked.CompareExchange(ref contingentProps.m_completionEvent, newMre, null) != null)
{
// Someone else already set the value, so we will just close the event right away.
newMre.Dispose();
}
else if (!wasCompleted && IsCompleted)
{
// We published the event as unset, but the task has subsequently completed.
// Set the event's state properly so that callers don't deadlock.
ContingentProperties.SetEvent(newMre);
}
}
return contingentProps.m_completionEvent;
}
}
但是,运行任务难道不意味着线程池将"工作项"(在高级中表示为任务)放到全局/本地队列中,然后它将被工作线程拾取来运行吗?是否需要使用任何内核线程同步构造?我的意思是它与谁同步?这里使用内核构造的目的是什么?