2013-12-20 32 views
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再次引用它。基本上,xinput是一回事。也許我可以使用閉包來引用input,但是我不知道我會傳遞給action()

有沒有一種方法可以改善這種效用方法的效果?

回答

1

在我的答案看看這裏(注意,不是公認的答案,但它執行大大超過公認的答案越好):
https://stackoverflow.com/a/1150287/138304

您的代碼可以簡化爲這樣:

public Result Parse(string input) 
{ 
    using (InitLock.ReadLock()) 
    { 
     return parser.Parse(input); 
    } 
} 
+0

這絕對是一個有趣的方法! –

+0

這工作得很好!我已將此代碼添加到我的擴展方法集合中。 –