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日

相关文章

  • 深入探究ASP.NET Core Startup初始化问题

    深入探究 ASP.NET Core Startup 初始化问题 在 ASP.NET Core 中,Startup 类是应用程序的入口点,它负责配置应用程序的服务和中间件。本攻略将深入探究 ASP.NET Core Startup 初始化问题,包括 Startup 类的构造函数、ConfigureServices 方法和 Configure 方法。 Start…

    C# 2023年5月17日
    00
  • c#调用vc写的ocx控件示例

    C# 调用 VC 写的 OCX 控件需要使用 COM 互操作技术来实现,这里提供一份完整攻略,包含如下步骤: 编写 VC 的 OCX 控件首先需要使用 VC 编写一个 OCX 控件,在编写过程中需要注意接口设计,以便在后续的调用中能够顺利确定方法和参数。实现后,需要注册控件并生成 TLB 文件。 引入 TLB 文件在 C# 项目中引入生成的 TLB 文件,以…

    C# 2023年6月7日
    00
  • 利用C#守护Python进程的方法

    利用C#守护Python进程的方法 在某些应用场景中,可能需要通过C#程序来启动和守护Python进程,以达到对Python进程的控制和管理。本文将介绍一种利用C#守护Python进程的方法。 原理说明 Python是一门脚本语言,它的运行需要依托于解释器。因此,要启动Python进程,就需要启动对应的Python解释器。在Windows系统中,Python…

    C# 2023年6月6日
    00
  • C#中String和StringBuilder的简介与区别

    下面为您详细讲解”C#中String和StringBuilder的简介与区别”。 一、String和StringBuilder的简介 1. String String是一个不可变类,它代表着一个字符串对象。在C#中,我们可以使用String类来表示纯文本的字符串。由于String对象是不可变的,所以对于String对象的任何改变都会导致新的对象的创建。这就意…

    C# 2023年6月7日
    00
  • C#用websocket实现简易聊天功能(客户端)

    下面是C#用websocket实现简易聊天功能(客户端)的完整攻略。 1. 准备工作 在开始实现聊天功能之前,你需要先准备好以下几件事情: 安装websocket库:你可以通过在Visual Studio中打开NuGet包管理器,然后搜索websocket来安装websocket库。 了解websocket连接的基本知识:websocket是一种基于TCP协…

    C# 2023年5月15日
    00
  • Visual Studio寻找C#程序必要的运行库文件

    当我们用Visual Studio创建C#程序并尝试运行时,有时可能会遇到找不到必要的运行库文件的情况。为了解决这个问题,可以采用以下攻略。 第一步:检查程序是否需要的运行库 首先需要确认程序是否真的需要依赖于某个运行库,我们可以通过查看程序的引用来确定是否有引用第三方库或系统库,如果有,就需要检查这些库是否被正确地安装在了计算机中。 第二步:检查项目属性 …

    C# 2023年6月1日
    00
  • ASP.NET Core自定义中间件的方式详解

    ASP.NET Core自定义中间件的方式详解 在ASP.NET Core中,中间件是一种非常强大的机制,可以在请求管道中执行自定义逻辑。本攻略将提供一些示例,演示如何在ASP.NET Core中创建自定义中间件。 步骤 步骤1:创建.NET Core Web API项目 首先,需要创建一个.NET Core Web API项目。可以使用以下命令在命令行中创…

    C# 2023年5月17日
    00
  • 如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    我来为您详细讲解如何使用C#将Tensorflow训练的.pb文件用在生产环境。 背景介绍 Tensorflow是目前深度学习领域广泛使用的一个强大的开源库,它提供了许多的高级API和工具来帮助我们训练和使用深度学习模型。在Tensorflow中,模型可以被保存成一个.pb文件,该文件包含了模型的结构和参数信息,可以在需要的时候被载入到内存中进行推断。 在实…

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