C# 静态 public 字段用于增量线程 actor 执行

C# Static public fields for increment thread actors execution

我正在使用 AKKA.net 构建一个系统(可能与这个问题无关)并且我有一个 class 负责计算演员的数量 运行 (对于谁不知道演员他们可以看作是简化的线程)。所以基本上我有一个静态 public 字段:

class MyClass{
    public static long TotalOutstandingRequests;
}

我 increment/decrement 它在 actors/threads 里面(因为我有演员 start/run 其他演员)与:

Interlocked.Increment(ref MyClass.TotalOutstandingRequests);
Interlocked.Decrement(ref MyClass.TotalOutstandingRequests);

发生的事情是 IDE 和互联网说拥有 public 静态字段是个坏主意,所以我想知道是否有其他方法可以解决我的问题,或者不,如果完全可以,让事情保持原样。

如果你使用得当,这样也未尝不可。

无论如何,你可以公开一些静态方法,比如:

public static long AddRequest() 
{
    return Interlocked.Increment (ref _totalOutstandingRequests);
}

public static long RemoveRequest() 
{
    return Interlocked.Decrement (ref _totalOutstandingRequests);
}

public static long GetRequests() 
{
    return _totalOutstandingRequests;
}

这个坏主意是因为它可以变成非静态超时(在你开发的时候)。

为什么这么问?仅仅是因为在某个时间点你会想要这个静态依赖的非静态依赖。无论是记录器、数据库、助手 class、服务、连接,无论什么都有不同的生命周期。

另一方面,对于非静态,您可以通过确保创建一次或使用依赖注入轻松管理单例静态 和其他可能的生命周期(是的,有多个生命周期,例如 per-connection、per-session、per-thread 等)。

所以解决方案:

public class MyClass
{
    public long TotalOutstandingRequests;
    private readonly ILogger _logger;
    //some incrementing, decrementing code here
    public MyClass(ILogger logger)
    {
        _logger = logger;
    }
    public void AddRequest()
    {
        Interlocked.Increment(ref TotalOutstandingRequests);
        _logger.Debug("New request here!");
    }
}

那么什么时候使用静态呢?简单:

  • 当您确定它没有依赖性,将来不会有依赖性并被刻在石头上时(语言扩展,例如 LINQ、Regex、任何辅助方法、常量等)
  • 您使用非托管代码(调用 windows 函数等)。

除了这两种情况,我从来没有遇到过没有静态代码就活不下去的代码。

PS

如果是家庭项目-你可以忘记我说的,按照你想要的方式去做=)