我是一名自学成才的 C# 程序员,在对事物有非常透彻的理解时,我在这里和那里错过了一些东西,现在我偶然发现了一些我无法找到答案的东西所以。我试图更好地理解 C# 中的线程安全,但让我先指定上下文。
我目前正在开发一个 Windows 服务,它会根据驻留在 SQL Server 数据库中的时间表启动并执行一些监视工作。它将通过向多个“客户端服务器”发出 http 请求来监视某些服务器,安装在这些服务器上的客户端将响应请求的信息。
由于此监视器服务可能会变得非常繁忙,因此我已将其设置为在计划执行工作时将每个“计划指令”粘贴在新线程中。这是为了确保我的计时器一直运行良好,准备好启动下一个指令到下一个“客户端服务器”。
每条指令的一部分是必须登录数据库,它已成功执行以及响应是什么等等。现在我的监视器服务中有 a public static class Logger
,我相信这很方便,因为我现在可以Logger.Log(... )
在需要记录事物时轻松地以这种方式调用它。此日志记录在此类中通过 EF 发生在 SQL Server 数据库中。
对我来说,这一切听起来真的很酷,我对它的工作方式很满意,但我还没有对任何东西进行负载测试。所有这一切的问题是我的大脑告诉我,因为我的记录器类是静态的 -根据我的理解,因此它只实例化一次?- 如果超过 1 个线程试图同时调用Logger.Log(.. )
,我的监控服务会发生坏事。
这里有人可以启发我吗?我的想法是对还是错?如果你知道答案,请解释清楚,因为我很想理解它。:)
更新:
感谢到目前为止的回复,事情变得越来越清楚,因为人们正在询问有关该Log
方法的更多细节,而我目前不在我的开发 PC 上,我将尝试更详细地解释它的工作方式。
该Log
方法所做的只是根据一些先前实例化的对象的数据,通过 EF 向 SQL 数据库添加一条记录,这些对象作为参数传递给该方法。数据库上下文被实例化为静态类上的静态私有变量。这样做的原因是我不必在重载中继续使用 using 语句。