我有一项服务正在重写以使用线程。我知道一个线程的状态不应该被另一个线程访问,但我对“状态”的构成有点困惑。这是否意味着方法范围之外的任何字段/属性/方法?
具体来说,我的服务看起来像这样:
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
如果我们在设置标志以暂停我们的进程队列线程之前检查队列的长度,然后另一个资源将一个项目添加到队列中,那么我们的进程队列线程将处于暂停状态,而可能在检查队列长度和设置暂停标志之间添加了项目...
如果所有资源仅以只读方式访问队列(我想不出只读队列的单个有用应用程序),则无需锁定它。
我是一名优秀的程序员,十分优秀!