这里表达了什么意图?:
lock(Locker)
{
Task.Factory.StartNew(()=>
{
foreach(var item in this.MyNonCurrentCollection)
{
//modify non-concurrent collection
}
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchonizationContext())
.ContinueWith(t => this.RaisePropertyChanged("MyNonCurrentCollection"));
}
系统会锁定
(排队)直到Task
完成,还是系统只会锁定以启动新的Task
?后者暗示这把锁没用也是好事,对吧?我只是想从别人的代码中发现意图。这里的理想是保护 MyNonCurrentCollection
不被另一个线程修改。
最佳答案
Will the system lock (queue) until the Task completes
没有。
will the system lock only to start a new Task?
是的。
The latter implies that this lock is kind if useless, right?
看起来是这样,尽管在没有看到完整上下文的情况下您不能总是确定。例如,有时我会根据需要锁定的资源编写需要检查它是否应该启动任务的代码,因此锁定刚刚启动任务的代码可能是合适的。如果您除了开始任务之外没有做任何事情,那么情况可能并非如此。
The ideal here is to protect MyNonCurrentCollection from being modified by another thread.
这并不能阻止这种情况。
旁注,在 foreach
中修改该集合上的集合是个坏主意。有些集合足以抛出某种并发修改异常。不太好的集合只会产生困惑的结果。
关于c# - 用锁包装任务不是很有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19692234/