DR使用委托执行冗余锁定代码



我有一个类,它有十几个方法,如下所示:

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);
}

这是有效的,但是有两件事让我很恼火。首先,utility方法假设有一个返回值和一个并且只有一个参数。如果我想包装一个有多个参数或没有返回值的函数,我必须为这些情况创建重载。第二,我认为将input传递给Func<>,然后使用x再次引用它有点奇怪。基本上,xinput是相同的东西。也许我可以使用闭包引用input,但是我不知道我会传递给action()什么。

有没有办法改进这种实用方法,使其更好地工作?

在这里查看我的答案(请注意,这不是公认的答案,但它的性能明显优于公认的答案):
https://stackoverflow.com/a/1150287/138304

您的代码简化为:

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

最新更新