我想要List<T>一个属性的实现,可以毫无疑问地使用线程安全.
像这样的东西:
private List<T> _list;
private List<T> MyT
{
get { // return a copy of _list; }
set { _list = value; }
}
Run Code Online (Sandbox Code Playgroud)
看来我仍然需要返回一个集合(克隆)的集合,所以如果我们在某个地方迭代集合并同时设置集合,那么就不会引发异常.
如何实现线程安全的集合属性?
我知道一般来说List不是线程安全的,但是如果线程从不在列表上执行任何其他操作(例如遍历它),那么简单地将项添加到列表中是否有什么问题?
例:
List<object> list = new List<object>();
Parallel.ForEach(transactions, tran =>
{
list.Add(new object());
});
Run Code Online (Sandbox Code Playgroud) 该接受的答案质疑"为什么这个Parallel.ForEach代码冻结程序吗?" 建议在WPF应用程序中用ConcurrentBag替换List使用.
我想了解是否可以在这种情况下使用BlockingCollection?
下面的代码只是创建一个List> of random numbers,然后计算并行foreach循环中每个列表的累积和.为什么我得到的数字少于'numLists'?通常在9990左右.我猜它与线程安全有关.什么是替代方法?(我是C#初学者,所以希望我使用正确的术语)谢谢.
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace testParallelForeach
{
class Program
{
static void Main(string[] args)
{
List<List<double>> bsData = new List<List<double>>();
List<List<double>> cumsumDataP = new List<List<double>>();
int numLists = 10000;
int myLen = 400;
Random rand = new Random();
for (int i = 0; i < numLists; i++)
{
bsData.Add(new List<double>());
for (int j = 0; j < myLen; j++)
{
bsData[i].Add(rand.NextDouble());
}
}
Parallel.ForEach(bsData, a => cumsumDataP.Add(CumulativeSumParallel(a)));
Console.WriteLine("cumsumDataP.Count={0}", cumsumDataP.Count);
Console.ReadKey();
}
public static List<double> …Run Code Online (Sandbox Code Playgroud) .NET 5.0
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;
using System;
using System.Collections.Generic;
namespace AsyncTest
{
[TestClass]
public class AsyncTest
{
public async Task AppendNewIntVal(List<int> intVals)
{
await Task.Delay(new Random().Next(15, 45));
intVals.Add(new Random().Next());
}
public async Task AppendNewIntVal(int count, List<int> intVals)
{
var appendNewIntValTasks = new List<Task>();
for (var a = 0; a < count; a++)
{
appendNewIntValTasks.Add(AppendNewIntVal(intVals));
}
await Task.WhenAll(appendNewIntValTasks);
}
[TestMethod]
public async Task TestAsyncIntList()
{
var appendCount = 30;
var intVals = new List<int>();
await AppendNewIntVal(appendCount, intVals);
Assert.AreEqual(appendCount, intVals.Count);
} …Run Code Online (Sandbox Code Playgroud) 假设我们有多个线程和一个List负责保存实时数据的公共。我们有一些线程负责将数据添加到列表对象。另一个线程负责从列表对象中获取数据,然后从顶部删除项目。
问题:从 a 的开头删除List并同时在单独的线程中将数据添加到列表的末尾是否安全?List对象是如何实现的?
c# ×6
.net ×1
.net-5 ×1
asp.net ×1
async-await ×1
asynchronous ×1
collections ×1
linq ×1
properties ×1
wpf ×1