我有一個服務,我正在重寫使用線程。我明白,一個線程的狀態不應該被另一個線程訪問,但是我對「狀態」的構成有點困惑。這是否意味着在方法範圍之外的任何字段/屬性/方法?使用線程時,我需要鎖定「只讀」服務嗎?
具體來說,我的服務看起來是這樣的:
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"); }
}
}