asp.net中使用单例

摘要

有这样一个service,需要运行的asp.net站点上,但要保证这个实例是唯一的。单例用来启用聊天机器人,保证唯一,以免启动多个,造成客户端发送消息的时候,会造成每个机器人都发送消息,app收到多条消息。

Demo

单例类

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Wolfy.SingleDemo.Models
{
    public class SingleParameter
    {
        private static SingleParameter instance;
        private static readonly object obj = new object();
        private static List<string> Names;
        public static SingleParameter CreateInstance()
        {
            if (instance == null)
            {
                lock (obj)
                {
                    if (instance == null)
                    {
                        instance = new SingleParameter();
                    }
                }
            }
            return instance;
        }
        private SingleParameter()
        {
            Names = new List<string>();
        }
        public  void Remove(string name)
        {
            lock (obj)
            {
                for (int i = Names.Count - 1; i >= 0; i--)
                {
                    if (Names[i] == name)
                    {
                        Names.RemoveAt(i);
                    }
                }
            }
        }
        public  void Set(string name)
        {
            lock (obj)
            {
                if (!Names.Contains(name))
                {
                    Names.Add(name);
                }
               
            }
        }
        public  List<string> GetNames()
        {
            lock (obj)
            {
                return Names;
            }
        }
    }
}
复制代码

测试例子

在视图List中展示添加了哪些name,在视图Add中添加name,通过刷新list查看是否已经保存在了集合中。

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Wolfy.SingleDemo.Models;

namespace Wolfy.SingleDemo.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult List()
        {
            SingleParameter single = SingleParameter.CreateInstance();
            for (int i = 0; i < 10; i++)
            {
                single.Set((i + 1).ToString());
            }
            return View(single.GetNames());
        }
        public ActionResult Add(string name)
        {
            SingleParameter single = SingleParameter.CreateInstance();
            single.Set(name);
            return View(single.GetNames());
        }
    }
}
复制代码

结果

posted @   wolfy  阅读(1635)  评论(3编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2014-06-25 [Asp.net]IIS经典和继承模式
点击右上角即可分享
微信分享提示