データベースの作業を行う次のコードがあります。
[WebMethod]
public void FastBulkAdd(int addmax){
Users[] uploaders = db.Users.Take(addmax).ToArray();
Parallel.ForEach(uploaders, item =>
{
Account account;
lock (this)
{
account = item.Account;
}
}
すべてのユーザーが 1 つのアカウントを持ち、外部キーを介して DB の別のテーブルで参照されます (各ユーザーが正確に 1 つのアカウントを持っていると確信しています)。マルチスレッドのデータベース接続ではエラーが発生するため、そのコードをロックする必要があります。この addmax を 1 に設定して (1 つのスレッドの実行を許可する) 実行すると、問題なく動作しますが、addmax が 1 よりも大きく、複数のスレッドが実行されると、アカウントは常にnull になり、後で例外が生成されます。ロックがスキップされているようです。
更新:アカウントが常に null になるとは確信していなかったので、次のことを行いました。
int tries = 0;
while (account == null && tries < 100)
{
lock (this)
{
account = item.Account;
}
tries++;
}
そして、それはうまくいきました。あまりきちんとした解決策ではありません。今後この設計上の問題を回避できるように、問題の原因を知りたいです。