いくつかのスレッドを開始する次のコードがあります。
List<Stuff> lNewStuff = new List<Stuff>();
// populate lNewStuff
for (int i = 0; i < accounts.Length; i++)
{
Account aTemp = _lAccounts.Find(item => item.ID == accounts[i]);
Thread tTemp = new Thread(() => aTemp.ExecuteMe(lNewStuff));
tTemp.Start();
}
次に、Accountクラスに、ロックのあるExecuteMeメソッドがあります。
public class Account
{
private Object lockThis = new Object();
public void ExecuteMe(List<Stuff> lNewStuff)
{
//Ensure only one thread at a time can run this code
lock (lockThis)
{
//main code processing
}
}
}
これで、スレッドがlNewStuff == nullで始まる場合があります。これは、アカウントIDを持つ新しいものが見つからない場合があるためです。これは、このプロジェクトでは正常です。スレッドは常に実行を試みる必要がありますが、nullの場合は、このスレッドを終了させ、ロックが発生したときに待機しないようにします。
具体的には:
lNewStuffがnullでロックがある場合は、スレッドを終了します。(これを行う方法?)
lNewStuffがnullでロックがない場合は、通常どおり実行します(これはすでに実行されています)
lNewStuffがnullでなく、ロックがある場合は、ロックが終了するのを待ちます(これはすでに実行されています)
lNewStuffがnullでなく、ロックがない場合は、通常どおり実行します(これはすでに実行されています)