我有填充共享集合的方法和我调用它的lock
和一个Task
这样的:如何在继续之前确保任务已开始?
void PopulateCollection()
{
Task.Factory.StartNew(() =>
{
lock (_padlock)
{
_sharedDictionary = GetSharedDictionary();
}
});
}
我用同样的lock(_padlock)
围绕该集合时,它读取的内容。
我遇到的问题是Task.Factory
可能没有启动它的任务(因此可能没有获得锁定)。这导致竞赛状况。
像这样的读者方法存在:
void ReadCollection()
{
lock(_padlock)
{
DoSomethingWithCollection(_sharedDictionary);
}
}
所以我的问题是,我有这样的代码:
...
PopulateCollection();
... // some things happen
ReadCollection();
...
我不能保证它的读取之前收集填充,因为我在读取集合之前,不能保证任务已经开始(并且因此获得了锁定)。
我不想继续下去,直到获得锁定。
为什么你关心的比赛条件下,如果锁定周围的共享内存? – i3arnon
,因为锁没有及时获得。 – Matthew
如果它是在别的地方获得的,那么它会一直等到锁定空闲。 – i3arnon