C# 多线程记录

 开发中经常遇到不同的业务访问同一个数据源,而每一个业务的执行流就是一个线程,此时线程一多就会产生多线程最容易遇到的问题——并发。

什么是并发?

        举个很经典的例子:程序中我们经常要操作一些对象,尤其是内存中的数据

        

C# 多线程记录

 

        例如当前判断进入条件已经判断newModel不为空,sleep(10)称为比较耗时的运算,在此期间如果别的地方把newModel置空,等到sleep(10)结束就会产生异常,这里sleep只是一个放大的时间,实际业务中这种运算绝大部分都是毫秒甚至微妙级别的,不进行代码review很难发现这方面的问题,从而导致项目产生各种莫名其妙异常。

怎么解决并发?

        关于并发解决网上这方面教程也比较多,主要为加锁,设计模式-单例模式这两种结合解决并发问题。这里就暂时不详细举例了。内存中的集合数据可能比较常见的保存方式就是list,array,queue等,但是这些都是线程非安全的,在多线程操作中需要手动加锁,代码庞大之后,就有概率在一些地方丢锁或者重复加锁,更严重甚至产生死锁。

        既然有线程非安全,那必然有线程安全,线程安全集合有主要有五种(ConcurrentQueue,ConcurrentStack,ConcurrentBag,BlockingCollection,ConcurrentDictionary),他们在一定程度上使用了无锁技术和内存屏障比正常使用互斥锁有一定性能提升。这里说明一下BlockingCollection。

        BlockingCollection类似阻塞队列,其最舒服的地方位于它是实现了生产者——消费者的关系,比ConcurrentQueue好太多,同时他还支持foreach与限制最大容量。

        BlockingCollection.Add 如果生产超过指定容量BlockingCollection会自身阻塞停止生产

        BlockingCollection.Take如果消费过多,没有生产的内容,则会自身阻塞直到有新的生产内容加入,避免取空现象节约性能。


原文链接:https://www.cnblogs.com/Zjl-NanKe/p/17346766.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 多线程记录 - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • C# 无限级分类的实现

    C# 无限级分类的实现 什么是无限级分类? 无限级分类又称为多级分类,是指一种基于树状结构的数据分类方法。其特点是可以不断的按照需求无限拓展分类层级。 实现无限级分类的步骤 第一步:建立分类表 首先我们需要建立一个分类表,在分类表中应包含以下几个重要字段: 字段 类型 描述 id int 分类编号,主键 name nvarchar 分类名称 parent_i…

    C# 2023年5月31日
    00
  • 详解C#用new和override来实现抽象类的重写区别

    下面我将详细讲解“详解C#用new和override来实现抽象类的重写区别”的完整攻略。 什么是抽象类 抽象类是一个不能被实例化的类,通常被用来定义和封装一些通用的属性或方法,子类必须继承并实现这些抽象类中定义的方法。 在C#中,抽象类使用abstract关键字来进行定义,定义格式为: public abstract class MyClass { //类成…

    C# 2023年5月15日
    00
  • C#中的Internal关键字小结

    我们来详细讲解一下”C#中的Internal关键字小结”。 什么是Internal关键字 在C#中,Internal关键字表示访问修饰符,用于限制方法、属性、类、接口或变量的访问级别。当使用Internal修饰符时,它们只能被同一程序集中的其他代码访问。 Internal关键字的用途 Internal关键字最常用于开发库和框架,用于将某些类型或成员标记为只能…

    C# 2023年5月31日
    00
  • ASP.NET MVC学习笔记

    ASP.NET MVC学习笔记 – 完整攻略 什么是 ASP.NET MVC ASP.NET MVC 是一种基于模型-视图-控制器(Model-View-Controller,MVC)模式的架构,它提供了一种让 Web 应用程序的逻辑和表现分离的方式。ASP.NET MVC 通过区分应用程序的逻辑(控制器)和 UI(视图)来改进应用程序的可测试性和可维护性。…

    C# 2023年5月31日
    00
  • 使用源链接对ASP.NET Core源代码进行调试

    使用源链接对ASP.NET Core源代码进行调试 在ASP.NET Core应用程序中,源代码调试是一项非常重要的任务,它可以帮助您跟踪应用程序的运行情况并诊断问题。在本攻略中,我们将详细讲解如何使用源链接对ASP.NET Core源代码进行调试,并提供两个示例说明。 步骤一:启用源链接 要使用源链接对ASP.NET Core源代码进行调试,您需要在应用程…

    C# 2023年5月17日
    00
  • 在C#和Java语言中for和foreach的区别详解

    在C#和Java语言中for和foreach的区别详解 在C#和Java语言中,for和foreach都是循环语句,但在使用方式和效率上有一些区别。下面详细讲解它们的区别。 for循环 for循环是一种常用的循环语句,用于在已知循环次数的情况下重复执行一段代码。其语法如下: for (初始化; 条件; 递增/递减) { //代码块 } for (初始化; 条…

    C# 2023年6月7日
    00
  • 一个支持普通分页和综合分页的MVC分页Helper

    针对这个话题,我将提供一个完整的攻略来实现一个支持普通分页和综合分页的MVC分页Helper。 目录 前言 步骤1:创建分页Helper 步骤2:使用分页Helper 示例1:普通分页 示例2:综合分页 前言 MVC中的分页是非常常见的需求,通过分页我们可以实现对数据的有序浏览和管理。普通分页的实现其实并不是太难,但是如何实现综合分页则有些复杂。在这里,我将…

    C# 2023年5月31日
    00
  • ASP.NET Core 依赖注入生命周期示例详解

    ASP.NET Core 依赖注入生命周期示例详解攻略 在本攻略中,我们将深入讲解ASP.NET Core依赖注入生命周期,并提供两个示例说明。 什么是ASP.NET Core依赖注入生命周期? ASP.NET Core依赖注入生命周期是指在ASP.NET Core应用程序中注册和解析服务时,服务的生命周期如何管理。ASP.NET Core提供了三种生命周期…

    C# 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部