在多个会话/应用程序实例之间共享一个对象实例.净MVC

本文关键字:实例 之间 共享 MVC 一个对象 应用程序 会话 | 更新日期: 2023-09-27 18:07:42

我正在开发一个日志监视器项目,我正在使用ASP。. NET应用程序

应用程序的主要目标是提供跨不同位置的多个客户端的错误日志监视器(LCD监视器)。每当在数据库中创建日志错误时,应用程序应将新错误通知所有客户端。

我想在web应用程序中创建一个静态的Timer变量,这将由Application_Start方法启动。

但是,知道应用程序每个会话只有一个线程,我认为web服务器将有很多定时器一起运行。

我需要知道如何使这个Timer实例唯一的所有会话实例在web服务器

在多个会话/应用程序实例之间共享一个对象实例.净MVC

Application_Start不是由新会话触发的,而是由应用程序的启动触发的。如果您在Application_Start中初始化计时器,则无需担心多个计时器实例。

您可以创建一个具有计时器的实例类。

例如:

public class MyTimerHolder
    {
        private static Lazy<MyTimerHolder> _instance = new Lazy<MyTimerHolder>(() => new MyTimerHolder());
        private readonly TimeSpan _checkPeriod = TimeSpan.FromSeconds(3);
        private IHubContext _hubProxy;
        // Threaded timer
        private Timer _timer;
        public MyTimerHolder()
        {
            _timer = new Timer(CheckDB, null, _checkPeriod, _checkPeriod);
        }
        public void BroadcastToHub(IHubContext context)
        {
            _hubProxy = context;
        }
        public void CheckDB(object state)
        {
            if (_hubProxy != null)
            {
                // Logic to check your database
                _hubProxy.Clients.All.foo("Whatever data you want to pass");
            }
        }
        public static MyTimerHolder Instance
        {
            get
            {
                return _instance.Value;
            }
        }
    }

那么您可以在任何方法的任何点更改hubContext。所以让我们说你想广播到连接到集线器"MyDBCheckHub"的客户端。在应用程序的任何地方,你所要做的就是:

MyTimerHolder.Instance.BroadcastToHub(GlobalHost.ConnectionManager.GetHubContext<MyDBCheckHub>());

你可以把它放在你的应用程序开始或任何你喜欢的地方,在应用程序域中只有一个MyTimerHolder实例