gpt4 book ai didi

c# - 使用委托(delegate) DRYing 多余的锁定代码

转载 作者:太空宇宙 更新时间:2023-11-03 13:30:36 24 4
gpt4 key购买 nike

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

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() .

有没有办法改进这个实用方法使其工作得更好一些?

最佳答案

在这里看看我的答案(请注意,这不是公认的答案,但它比公认的答案表现得更好):
https://stackoverflow.com/a/1150287/138304

您的代码简化为:

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

关于c# - 使用委托(delegate) DRYing 多余的锁定代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20696423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com