Tag:

这是使用Parallel.ForEach()线程安全吗?

基本上,我正在使用这个: var data = input.AsParallel(); List output = new List(); Parallel.ForEach(data, line => { String outputLine = “”; // ** Do something with “line” and store result in “outputLine” ** // Additionally, there are some this.Invoke statements for updating UI output.Add(outputLine); }); 输入是List对象。 ForEach()语句对每个值执行一些处理,更新UI,并将结果添加到output List 。 这有什么本质上的错误吗? 笔记: 输出顺序并不重要 更新: 根据我得到的反馈,我在output.Add语句以及UI更新代码中添加了手动lock 。

是否可以从另一个线程观察部分构造的对象?

我经常听说在.NET 2.0内存模型中,写入总是使用释放围栏。 这是真的? 这是否意味着即使没有明确的内存屏障或锁定,也不可能在不同于创建它的线程上观察部分构造的对象(仅考虑引用类型)? 我显然排除了构造函数泄漏this引用的情况。 例如,假设我们有不可变的引用类型: public class Person { public string Name { get; private set; } public int Age { get; private set; } public Person(string name, int age) { Name = name; Age = age; } } 是否可以使用以下代码观察除“John 20”和“Jack 21”之外的任何输出,例如“null 20”或“Jack 0”? // We could make this volatile to freshen the read, […]

以线程安全的方式写入文件

将Stringbuilder写入异步文件。 此代码控制文件,将流写入其中并释放它。 它处理来自异步操作的请求,这些请求可能随时出现。 FilePath是按类实例设置的(因此锁定Object是每个实例),但是由于这些类可能共享FilePaths ,因此可能存在冲突。 这种冲突以及来自类实例之外的所有其他类型将被处理重试。 这段代码适合它的用途吗? 有没有更好的方法来处理这个问题,这意味着对捕获和重试机制的依赖程度更低(或没有)? 另外,我如何避免捕获因其他原因而发生的exception。 public string Filepath { get; set; } private Object locker = new Object(); public async Task WriteToFile(StringBuilder text) { int timeOut = 100; Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); while (true) { try { //Wait for resource to be free lock (locker) { using (FileStream file […]

IEnumerable Linq方法是否是线程安全的?

我想知道Linq扩展方法是否是primefaces的? 或者,在进行任何类型的迭代之前,我是否需要lock线程中使用的任何IEnumerable对象? 将变量声明为volatile是否会对此产生影响? 综上所述,以下哪项是最好的,线程安全,操作? 1-没有任何锁: IEnumerable _objs = //… var foo = _objs.FirstOrDefault(t => // some condition 2-包括锁定语句: IEnumerable _objs = //… lock(_objs) { var foo = _objs.FirstOrDefault(t => // some condition } 3-将变量声明为volatile: volatile IEnumerable _objs = //… var foo = _objs.FirstOrDefault(t => // some condition