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#打开扬声器的实操方法和代码 在C#语言中,我们可以通过使用System.Media命名空间中的SoundPlayer类来播放音频文件。以下是打开扬声器的实操方法和代码。 例1:使用SoundPlayer播放本地音频文件 首先需要在你的项目中引入System.Media命名空间。 using System.Media; 接着,创建一个新的实例SoundPl…

    C# 2023年6月7日
    00
  • Unity游戏开发实现背包系统的示例详解

    我来为你详细讲解“Unity游戏开发实现背包系统的示例详解”的完整攻略。 背包系统的概述 在游戏开发中,背包系统是一个比较常见的功能。它通常用于存储玩家各类物品,如道具、装备等。在 Unity 游戏开发中,实现背包系统有很多不同的方法,但其中比较常见的方法是往场景中添加一个 Panel,通过控制 Panel 中的 UI 元素来实现。 实现背包系统的步骤 实现…

    C# 2023年6月3日
    00
  • vs 中C#项目读取JSON配置文件的方法

    下面我来详细讲解在 VS 中 C# 项目读取 JSON 配置文件的方法。 一、准备工作 在讲解具体方法前,我们需要先进行准备工作: 首先需要确保你的项目中已经包含了 Newtonsoft.Json 的 NuGet 包,否则,请右键项目选择“管理 NuGet 包”来安装该包。 其次需要准备一个 JSON 配置文件作为示例,这里以以下内容为例: { "…

    C# 2023年5月31日
    00
  • 手动把asp.net的类生成dll文件的方法

    为手动把ASP.NET的类生成DLL文件,需要按照以下步骤操作: 步骤一:创建ASP.NET类 首先,我们需要创建一个ASP.NET类。在Visual Studio中,可以通过以下步骤创建: 打开Visual Studio,创建一个新项目。 在“新建项目”对话框中,选择“ASP.NET Web 应用程序”类型。 输入项目名称,选择位置,点击“确定”。 在“新…

    C# 2023年5月31日
    00
  • C# CopyTo(Array,Int32):从特定的索引开始将集合的元素复制到数组中

    C#中的 CopyTo 方法定义在 System.Array 类中。它允许将当前数组中的元素复制到另一个数组中。 CopyTo 方法有两个参数,第一个参数指定目标数组,第二个参数则指定从目标数组中的哪个位置开始复制。在本文中,我们将详细讲解 CopyTo 方法的完整攻略,并提供两个示例以便更好地理解它的工作原理。 语法 public void CopyTo(…

    C# 2023年4月19日
    00
  • WPF的数据绑定详细介绍

    WPF的数据绑定是WPF框架中的一个重要功能,它能够帮助我们将数据与界面进行绑定,使数据的变化自动反映在界面上。下面,我会给出关于数据绑定的详细介绍,包括数据绑定的意义、数据绑定的实现方式、数据绑定的语法等。同时,还会通过两个示例来说明数据绑定的应用。 1. 数据绑定的意义 在传统的Windows应用中,数据更新通常都是手动进行的,这样就需要在代码中写入大量…

    C# 2023年5月31日
    00
  • asp.net GridView 删除时弹出确认对话框(包括内容提示)

    下面是关于“asp.net GridView 删除时弹出确认对话框(包括内容提示)”的完整攻略: 一、需求 我们需要在一个asp.net GridView中删除数据时,弹出确认对话框,同时包含内容提示,确保用户明确知道正在进行的操作。 二、实现步骤 1.在GridView中添加删除按钮。 在GridView的模板列中,添加一个“删除”按钮,并设置Comman…

    C# 2023年6月1日
    00
  • Winform学生信息管理系统登陆窗体设计(1)

    下面是Winform学生信息管理系统登陆窗体设计的完整攻略。 一、设计思路 设计一个Winform学生信息管理系统登陆窗体需要以下几步: 新建一个Winform项目,添加登陆窗体。 设计登陆窗体的布局,包括添加组件,设置组件属性等。 为登陆窗体的组件添加事件处理程序,比如点击按钮触发登陆操作。 在事件处理程序中,编写验证登陆信息的代码,并执行相应的操作。 二…

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