私は、次の方法があります。C#歩留まりはロックを解除しますか?
public static IEnumerable<Dictionary<string, object>> GetRowsIter
(this SqlCeResultSet resultSet)
{
// Make sure we don't multi thread the database.
lock (Database)
{
if (resultSet.HasRows)
{
resultSet.Read();
do
{
var resultList = new Dictionary<string, object>();
for (int i = 0; i < resultSet.FieldCount; i++)
{
var value = resultSet.GetValue(i);
resultList.Add(resultSet.GetName(i), value == DBNull.Value
? null : value);
}
yield return resultList;
} while (resultSet.Read());
}
yield break;
}
を私は試してみて、いくつかのconcurancyの問題を取り除くためにlock(Database)
を追加しました。私は不思議ですが、yield return
のロックをDatabase
に解放し、次の繰り返しのときに再ロックしますか?または、Database
は反復の全期間ロックされたままですか?
http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspxの「最後に...」を参照してください –
これは潜在的に*非常に悪い考えです*。ロックが取得されてロックが解除されたときに、任意のコードを実行できるときに、ロック順序を制御することは非常に困難です。これはデッドロックを求めているだけです。 –
@Eric Lippert - 私はマルチスレッドのコーディングにあまり慣れていません。ロックステートメントの「魔法」は本当に単なる「try finally」ブロックであり、「yield」はyield状態にある間は範囲内にあるものを保持することが分かりました。これを念頭に置いて、 'for'ループだけを囲むようにロックを移動しました。これは、 "オフ"の繰り返し時間中にロックしないうちに必要なSQL Server CEアクセスに制限を与えます。 (少なくとも私は願っています!) – Vaccano