Skip to main content
 首页 » 编程设计

c#之使用线程时是否需要锁定 "read only"服务

2024年02月24日31artech

我有一项服务正在重写以使用线程。我知道一个线程的状态不应该被另一个线程访问,但我对“状态”的构成有点困惑。这是否意味着方法范围之外的任何字段/属性/方法?

具体来说,我的服务看起来像这样:

public class MyService 
{ 
      private IRepository<MyClass> repository; 
      private ILogger log; 
      ... 
      public void MyMethod() 
      { 
        ... 
        var t = new Thread(MyMethodAsync); 
        t.Start(someState); 
      } 
 
      //Is this OK??? 
      public void MyMethodAsync(object state) 
      { 
          var someState = (MyState)state; 
          log.Log("Starting"); 
          var someData = repository.GetSomeData(someState.Property); 
          //process data 
          log.Log("Done");             
      } 
 
      //Or should I be doing this: 
      public void MyMethodAsync2(object state) 
      { 
          var someState = (MyState)state; 
          lock(log){ 
             log.Log("Starting");  } 
 
          lock(repository){          
             var someData = repository.GetSomeData(someState.Property);} 
 
          //process data    
          lock(log){ 
             log.Log("Done"); }             
      } 
} 

请您参考如下方法:

呃...不,你不需要锁定只读的资源。锁定它们的目的是,如果您需要在写入之前检查资源的值,那么另一个资源就无法在您的读取和写入之间更改该值。即:

SyncLock MyQueue 
  If MyQueue.Length = 0 Then 
    PauseFlag.Reset 
  End If 
End SyncLock 

如果我们在设置标志以暂停我们的进程队列线程之前检查队列的长度,然后另一个资源将一个项目添加到队列中,那么我们的进程队列线程将处于暂停状态,而可能在检查队列长度和设置暂停标志之间添加了项目...

如果所有资源仅以只读方式访问队列(我想不出只读队列的单个有用应用程序),则无需锁定它。