2013-12-20 31 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

这工作得很好!我已将此代码添加到我的扩展方法集合中。 –