并发导致数据丢失怎么解决?

jiujiang88 2024-11-08 14:21:16

实际工作中,发现一个并发导致数据丢失的问题,大家一起看看是否有解决办法?

/// <summary>
/// 测试线程安全的队列
/// </summary>
public class TestConcurrentQueue
{
    public static void DoTest()
    {
        //构造测试数据
        List<IdNameModel> list = new List<IdNameModel>();
        for (int i = 0; i < 100; i++)
        {
            list.Add(new IdNameModel()
            {
                Id = i + 1,
                Name = "用户" + i
            });
        }
        _ = RunWork(list);
    }

    public async static Task RunWork(List<IdNameModel> list)
    {
        //装入队列中
        ConcurrentQueue<IdNameModel> queue = new ConcurrentQueue<IdNameModel>();
        foreach (IdNameModel item in list)
        {
            queue.Enqueue(item);
        }
        int numInOneTimes = 10; //并发一次处理数据条数
        Task[] tasks;
        List<int> ids = new List<int>();
        IdNameModel? dataItem = null;
        while (!queue.IsEmpty)
        {
            ids = new List<int>();
            tasks = new Task[queue.Count > numInOneTimes ? numInOneTimes : queue.Count];
            for (var i = 0; i < numInOneTimes; i++)
            {
                if (queue.TryDequeue(out dataItem))
                {
                    IdNameModel innerItem = dataItem;
                    tasks[i] = Task.Run(async () =>
                    {
                        ids.Add(innerItem.Id);
                        await Task.Delay(2000);
                        return;
                    });
                }
            }
            await Task.WhenAll(tasks);
            Console.WriteLine(string.Format("操作完成共【{0}】条数据,编号为【{1}】的数据列表!", ids.Count, string.Join(",", ids)));
        }
    }
}

public class IdNameModel
{
    public int Id { get; set; }
    public string? Name { get; set; }
}

实际输出的操作数据条数,始终比预定目标的1~100有差距,还在追查问题中...

...全文
125 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiujiang88 2024-11-08
  • 打赏
  • 举报
回复

唉,发现了,原来是我用了个不安全的List对象,换成ConcurrentBag对象就达到目的了。

62,266

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧