c# - 锁定所有方法的使用

标签 c# multithreading

我有一个同时从多个线程访问的方法,我想确保只有 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/

相关文章:

c++ - 如何在 boost HTML3 示例中向服务器发送 SIGTERM 或 SIGINT 信号?

c# - 逐步的功能测试自动化

C# 如何将 DataGridView 列标题显示到文本框中?

c# - 如何将消息从托管应用程序的一个实例发送到另一个实例?

c# - 如何替换正则表达式中匹配的一部分

c# - CancellationToken 阻塞线程执行

c++ - 从线程中获得的 yield 远低于预期 - 为什么?

c# - Sharepoint 开发教程

c++ - 如果我锁定变量,是否必须将复杂类型标记为 `volatile`?

c++ - 将结构对象作为参数传递给线程