gpt4 book ai didi

c# - 用锁包装任务不是很有用吗?

转载 作者:行者123 更新时间:2023-11-30 13:46:48 25 4
gpt4 key购买 nike

这里表达了什么意图?:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com