Parallel.ForEach 多线程 声明失败 "未将对象引用设置到对象的实例"

本文介绍了一个关于使用C#中Parallel.ForEach方法时出现的多线程错误,并给出了解决方案。通过引入锁机制确保了共享资源访问的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

x

using System;
using System.Collections.Generic;

namespace Parallel.ForEach
{
    class Program
    {
        //代码结构应该都是这样的吧...但是实际环境中方法Test中的逻辑要复杂很多的...
        static void Main(string[] args)
        {
            //测试数据...
            List<int> intList = new List<int>();
            for (int i = 0; i < 20; i++)
            {
                intList.Add(i);
            }
//问题在于执行这个方法的时候报错... System.Threading.Tasks.Parallel.ForEach(intList, (iModel)
=> { Test(iModel); }); } /// <summary> /// 这里仅仅是测试方法,实际中的这个方法逻辑比较复杂... /// </summary> /// <param name="i"></param> public static void Test(int i) {         int tempI = 0;//当MaxDegreeOfParallelism设置为3或者以上的时候,就会报错,调试-添加并行监视-会看到"tempI"有几次是没有声明的...{当前上下文中不存在名称“tempI”}
            tempI = i + 1;
            Console.WriteLine(tempI); } } }

刚开始搜还没搜到咋回事...多线程确实鄙人用的比较少。。。哈哈。。。

结果终于在csdn上看到了结果方案,一个常年活跃在csdn论坛上老前辈给出了正确答案...传送门

private static object LockFlag = new object();

然后读写变量的时候都要使用它互斥,例如
lock(LockFlag)
{
    var x = ListInfo[i];
    ListInfo.Remove(x);
}

以后记住了,多线程,要记得Lock...Lock...

 

 

x

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值