如何正确锁定对象以进行C#中的扩展方法调用

时间:2018-09-07 06:16:38

标签: c# asp.net multithreading locking

下面两种锁定方式将产生什么区别。我对这种锁定方式的使用意义感到怀疑,并希望了解其内部工作原理。

          public static int DoJob(this MapperClass Mapper)
    {
        object MyLock = new object();

        lock (MyLock)
            {
                if (Mapper.MapId != null)
                {
                    //Do some Work
                }
                else                    
                {
                    //Do something else
                }
            }
        }

调用方法:

    private void InvokeDoJob(List<MapperClass> Mapper)
    {
        Mapper.ForEach(item =>
        {
           item.DoJob();
        });
    }

而这个InvokeDojob正在调用多线程模型。

建议我如何进行锁定,这是正确的方法。

下面的代码也有什么不同。我看到锁定仅在类级别完成。

            class Department
                {
                    Object thisLock = new Object();
                    int salary;
                    Random r = new Random();
                    public Department(int initial)
                    {
                        salary = initial;
                    }
                    int Withdraw(int amount)
                    {
                        lock (thisLock)
                        {
                            if (salary >= amount)
                            {
                                //Console.WriteLine("salary before Withdrawal :  " + salary);
                                return amount = 10;
                            }
                            else
                            {
                                return amount = 20;
                            }
                        }
                    }
                }

0 个答案:

没有答案