相关疑难解决方法(0)

线程安全List <T>属性

我想要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)

看来我仍然需要返回一个集合(克隆)的集合,所以如果我们在某个地方迭代集合并同时设置集合,那么就不会引发异常.

如何实现线程安全的集合属性?

c# collections properties thread-safety

108
推荐指数
7
解决办法
16万
查看次数

List.Add()线程安全

我知道一般来说List不是线程安全的,但是如果线程从不在列表上执行任何其他操作(例如遍历它),那么简单地将项添加到列表中是否有什么问题?

例:

List<object> list = new List<object>();
Parallel.ForEach(transactions, tran =>
{
    list.Add(new object());
});
Run Code Online (Sandbox Code Playgroud)

c# asp.net

79
推荐指数
6
解决办法
4万
查看次数


并行的foreach循环 - 奇怪的行为

下面的代码只是创建一个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 c# parallel-processing

9
推荐指数
1
解决办法
2544
查看次数

仅使用 async/await 时是否存在竞争条件?

.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)

c# asynchronous race-condition async-await .net-5

3
推荐指数
1
解决办法
173
查看次数

从 List 对象中添加和删除项目是否安全?

假设我们有多个线程和一个List负责保存实时数据的公共。我们有一些线程负责将数据添加到列表对象。另一个线程负责从列表对象中获取数据,然后从顶部删除项目。

问题:从 a 的开头删除List并同时在单独的线程中将数据添加到列表的末尾是否安全?List对象是如何实现的?

c# multithreading thread-safety

2
推荐指数
1
解决办法
108
查看次数