我有一个同时从多个线程访问的方法,我想确保只有 1 个线程可以在任何方法的主体内。
能否将此代码重构为更通用的代码? (除了锁定 State 属性之外?
public class StateManager : IStateManager
{
private readonly object _lock = new object();
public Guid? GetInfo1()
{
lock (_lock)
{
return State.Info1;
}
}
public void SetInfo1(Guid guid)
{
lock (_lock)
{
State.Info1 = guid;
}
}
public Guid? GetInfo2()
{
lock (_lock)
{
return State.Info2;
}
}
public void SetInfo2(Guid guid)
{
lock (_lock)
{
State.Info2 = guid;
}
}
}
最佳答案
也许是这样的:
private void LockAndExecute(Action action)
{
lock (_lock)
{
action();
}
}
那么你的方法可能看起来像这样:
public void DoSomething()
{
LockAndExecute(() => Console.WriteLine("DoSomething") );
}
public int GetSomething()
{
int i = 0;
LockAndExecute(() => i = 1);
return i;
}
我不确定这是否真的能为您节省很多,但是返回值有点麻烦。
虽然您可以通过添加另一个方法来解决这个问题:
private T LockAndExecute<T>(Func<T> function)
{
lock (_lock)
{
return function();
}
}
现在我的 GetSomething
方法更简洁了:
public int GetSomething()
{
return LockAndExecute(() => 1 );
}
同样,不确定您是否在减少键入方面获得了多少,但至少您知道每次调用都锁定在相同的对象上。
虽然在你需要做的只是锁定的情况下你的 yield 可能非常小,但我可以想象你有一堆这样的方法的情况:
public void DoSomething()
{
// check some preconditions
// maybe do some logging
try
{
// do actual work here
}
catch (SomeException e)
{
// do some error handling
}
}
在那种情况下,将所有前提条件检查和错误处理提取到一个地方可能会非常有用:
private void CheckExecuteAndHandleErrors(Action action)
{
// preconditions
// logging
try
{
action();
}
catch (SomeException e)
{
// handle errors
}
}
关于c# - 锁定所有方法的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434472/