我有以下方法: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;
}
我剛添加的lock(Database)
,試圖擺脫一些concurancy問題。我很好奇,yield return
會釋放Database
上的鎖定,然後在下一次迭代時重新鎖定?或者Database
在整個迭代期間保持鎖定狀態?
請參閱http://csharpindepth.com/Articles/Chapter6/IteratorBlockImplementation.aspx – 2011-01-05 19:18:22
這是一個潛在的*非常糟糕的主意*。當您可以在獲取鎖定和釋放鎖定之間運行任意代碼時,很難控制鎖定順序。這只是要求解決死鎖問題。 – 2011-01-05 21:23:07
@Eric Lippert - 我不太熟悉多線程編碼。 (雖然我現在越來越好了。)現在我知道鎖定語句的「魔力」實際上只是一個「最終嘗試」塊,並且「yield」在處於收縮狀態時保持範圍。考慮到這一點,將鎖移動到只包圍'for'循環。這給我對SQL Server CE訪問的限制,我需要在「關閉」迭代期間不鎖定的情況。 (至少我希望如此!) – Vaccano 2011-01-05 21:27:24