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

标签 c# multithreading task-parallel-library

这里表达了什么意图?:

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/

相关文章:

.net - 同步上下文的切换是否意味着工作将在拥有同步上下文的线程上运行?

c# - ConfigureAwait 将继续推送到池线程

c# - 仅垂直移动表单

C# 相当于 ruby​​ 的字符串后继方法 ("abcd".succ -> "abce")

c# - 阶乘的答案不相同(平行和正常)

c++ - 为什么 std::condition_variable 不是按锁类型模板化的?

c - 如何立即退出pthread

c# - View 如何使用使用泛型的模型?

c# - 如何使用存储库模式和工厂方法模式组织我的类/接口(interface)?

android - onBackPressed 和 android 中的线程