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()
。
有没有一种方法可以改善这种效用方法的效果?
这绝对是一个有趣的方法! –
这工作得很好!我已将此代码添加到我的扩展方法集合中。 –