2
我有了大約有十幾個方法看起來像這樣一類冗餘鎖定代碼:曬出使用委託
public Result Parse(string input)
{
InitLock.EnterReadLock(); //Block while database is being initialized
try
{
return parser.Parse(input);
}
finally
{
InitLock.ExitReadLock();
}
}
返回類型和輸入參數不同,但我總是進入一個讀鎖,執行某種操作,然後退出讀鎖。我想知道是否可以創建一個實用函數來爲我處理鎖定。所以,我想出了這一點:
static TResult DoWithLock<T, TResult>(Func<T, TResult> action, T p)
{
InitLock.EnterReadLock(); //Block while database is being initialized
try
{
return action(p);
}
finally
{
InitLock.ExitReadLock();
}
}
現在我可以簡化上面的方法到:
public Result Parse(string input)
{
return DoWithLock(x => parser.Parse(x), input);
}
這工作,但兩件事情那種惹惱了我。首先,效用方法假定有一個返回值和一個且只有一個參數。如果我想包裝一個具有多個參數或沒有返回值的函數,那麼我必須爲這些情況創建重載。二,我認爲將input
傳遞給Func<>
有點奇怪,然後用x
再次引用它。基本上,x
和input
是一回事。也許我可以使用閉包來引用input
,但是我不知道我會傳遞給action()
。
有沒有一種方法可以改善這種效用方法的效果?
這絕對是一個有趣的方法! –
這工作得很好!我已將此代碼添加到我的擴展方法集合中。 –