C# 锁定类成员vs在类';方法?

C# 锁定类成员vs在类';方法?,c#,.net-core,synchronization,C#,.net Core,Synchronization,所以,我有这个服务,让我们称之为“我的服务”。MyService有一个公共方法,即“executeBatchJob”,顾名思义,它将执行一个batchJob,简而言之,从数据库中检索一些数据,在某个时刻,我有一个非常像实体的对象,具有ID和记录列表。在我的方法executeBatchJob中,会进行一些检查,当满足某些条件时,会将实体写入某个位置并重新初始化(新ID、不同记录),但请注意,它发生在executeBatchJob调用的私有方法中。在其他情况下,通过不同的私有方法,记录被添加到实体持

所以,我有这个服务,让我们称之为“我的服务”。MyService有一个公共方法,即“executeBatchJob”,顾名思义,它将执行一个batchJob,简而言之,从数据库中检索一些数据,在某个时刻,我有一个非常像实体的对象,具有ID和记录列表。在我的方法executeBatchJob中,会进行一些检查,当满足某些条件时,会将实体写入某个位置并重新初始化(新ID、不同记录),但请注意,它发生在executeBatchJob调用的私有方法中。在其他情况下,通过不同的私有方法,记录被添加到实体持有的记录列表中

我的问题是:由于服务可能由多个进程调用:最好将该实体声明为类成员(私有只读)并在需要时锁定它,然后使用一个方法为下一个进程清除该实体的状态。或者在我的方法executeBatchJob中声明并使用该对象更好,但在所有私有方法中拖动该对象,因为对象的状态可能会在几个“级别”上发生变化

为了向您说明我所解释的内容:

这是myEntity:

public class MyEntity
{
 public int Id { get; set; }
 public List<Record> Records { get;  set; }

 public void CleanUp(int newId)
 {
     Id = newId;
     Records.Clear();
 }
}
或者使用第二个选项:

public class MyService : IMyService
{

 public MyService()
 {
 }

 public void executeBatchJob(int batchId)
 {
     MyEntity myEntity = new MyEntity();

     APrivateMethodInExecuteBatchJob(myEntity);
     // more code

 }

 private returnResult APrivateMethodInExecuteBatchJob(MyEntity myEntity)
 {
      // Some manipulation of myEntity
      // some code, with another call to a private method with myEntity, and manipulation of myEntity

      // ... write the entity
      myRepository.write(myEntity);

 }
}
为了提供更多的上下文,据我所知,每次编写实体时,都必须对其进行清理,在第二个选项中,我可以只做一个“new MyEntity()”(从业务角度来看,这更有意义)

对我来说,第二种解决方案更具逻辑性和适用性,但是,我将有几个私有方法来移动对象,有时只是将对象传递给另一个私有方法,而无需进行任何其他操作,只需将其“传递”给另一个私有方法。。。一点也不干净


这就是为什么我需要你的建议/意见

使用
IDisposable
界面,它的目的正是您正在做的事情

public class MyEntity: IDisposable;
然后,您可以使用第二个选项和using关键字

您可以在这里查看一个关于实现什么和如何实现的示例

代码示例:

public void executeBatchJob(int batchId)
{

    using (vMyEntity myEntity = new MyEntity();) 
    {
       APrivateMethodInExecuteBatchJob(myEntity);
       // more code
    }

}

通常,在不需要锁的时候尽量避免使用锁。它可能会创建竞争条件,使您的应用程序响应性降低。

如果实体不应该保持其状态,我认为使用选项2中的幂等方法要好得多。如果您可以使这些方法成为静态的,那么最终将得到一个更简单的体系结构

正如您所确定的,您将遇到需要将资源锁定在选项1中的问题,并且只要在清理过程中状态被丢弃,就没有任何头痛的地方


对于类似选项1的东西,我能看到的唯一原因是,如果实体是从未在使用之间清除的事务中构建的,或者由于某种原因,创建实体非常昂贵

谢谢,我还是C夏普和.Net的新手,我忘记了IDisposable关键字,即使我最近用过它。
public void executeBatchJob(int batchId)
{

    using (vMyEntity myEntity = new MyEntity();) 
    {
       APrivateMethodInExecuteBatchJob(myEntity);
       // more code
    }

}