BlockingCollection集合是一个拥有阻塞功能的集合,它就是完成了经典生产者消费者的算法功能。一般情况下,我们可以基于 生产者 - 消费者模式来实现并发。BlockingCollection<T> 类是最好的解决方案
官方推荐使用Task.Run方法启动基于计算的任务, 当需要对长时间运行、基于计算的任务做精细化控制时使用Task.Factory.StartNew。
该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单、高性能兼容Redis协议的数据库的经历。首先这个"Redis"是非常简单的实现,但是他在优化这个简单"Redis"路程很有趣,也能给我们在从事性能优化工作时带来一些启示。原作者:Ayende Rahien 原链接:https://ayende.com/blog/197473-C/high-performance-net-building-a-redis-clone-architecture
异步编程在.NET平台上已经存在了好几年,但历史上一直很难做好。自从C# 5中引入async/await之后,异步编程已经成为主流。现代框架(如ASP.NET Core)是完全异步的,在编写Web服务时很难避免使用async关键字。因此,对于async的最佳实践以及如何正确使用它,人们一直有很多困惑。本文将利用代码来说明这种差异
System.Windows.Forms.Timer System.Threading.Timer
前言:最近给客户开发一个伙食费计算系统,大概需要计算2000个人的伙食。需求是按照员工的预定报餐计划对消费记录进行检查,如有未报餐有刷卡或者有报餐没刷卡的要进行一定的金额扣减等一系列规则。
前言:最近给客户开发一个伙食费计算系统,大概需要计算2000个人的伙食。需求是按照员工的预定报餐计划对消费记录进行检查,如有未报餐有刷卡或者有报餐没刷卡的要进行一定的金额扣减等一系列规则。一开始我的想法比较简单,直接用一个for循环搞定,统计结果倒是没问题,但是计算出来太慢了需要7,8分钟。这样系统服务是报超时错误的,让人觉得有点不太爽。由于时间也不多就就先提交给用户使用了,后面逻辑又增加了,计算时间变长,整个计算一遍居然要将近10分钟了。这个对用户来说是能接收的(原来自己手算需要好几天呢),但是我自己接受不了,于是就开始优化了,怎么优化呢,用多线程呗。
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。
通过ILSpy反编译查看可以知道,lock是个语法糖,编译后其实是Monitor.Enter 和 Monitor.Exit 的封装。
我在微软的团队快被微软 C# 里面的各种 IDisposable 对象给折腾疯了……
【译序:C#入门文章。请注意:所有程序调试环境为Microsoft Visual Studio.NET 7.0 Beta2和 Microsoft .net framework SDK Beta2。限于译者时间和能力,文中倘有讹误,当以英文原版为准】
发布于 2015-02-05 02:10 更新于 2018-06-13 03:02
这句话我记了一个多礼拜了, 自从上次东北师大面试之后, 具体请看<随便扯扯东北师大的面试>. 国庆闲着没事, 就大概了解了一下, 其实大二学习C# 的时候接触过, 只不过那会看的也看的懵懂, 我看的是vir in C#, 顺便查了些资料, 讲真, 看的头痛。现在过了这么久了, 学了这么久了, 再回来看看其实也不难, 当然深入去了解就gg了, 我还记得我的回答是:C# 有个GC可以自己回收, 在加上引用计数。没错, 我回答的就是这么笼统, 现在想想还是紧张了, 自己之前接触过, 其实都有印象, 下次面试不要急, 慢慢回想。
程序在计算机上跑着,就难免会占用内存资源来存储在程序运行过程中的数据,我们按照内存资源的存取方式将内存划分为堆内存和栈内存。
如果某个类型用到了非托管型的系统资源,那么就需要通过IDisposable接口的Dispose()方法来明确地释放。.NET环境规定,这种资源并不需要由包含该资源的类型或系统来释放,而是应该由使用此类型的代码释放。也就是说,如果你使用了带有Dispose()方法的类型,那么就应该调用它的Dispose()方法以释放其中的资源,而要想确保该方法总是能够得到调用,最好的办法就是利用using语句或try/finally代码块。
这些题目确实不怎么经常使用,因此在后文中,我会提一组我的私房经典“ 6k面试题”,供大家轻松一刻使用。
需要明确一下C#程序(或者说.NET)中的资源。简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:
一直以为 GC.KeepAlive 可以用于使某个托管对象永久的不被垃圾回收(调用该函数后需要主动进行 Free 之类的操作,类似于 GCHandle),但事实证明自己还是犯了望文生义的错误, GC.KeepAlive 虽然确实用于阻止托管对象的垃圾回收,但是在方式方法上和我之前的理解大相径庭.
之前对 C# 中的 Dispose 模式只有些模糊印象,近来又了解了一些相关知识,在此简单做些记录~
BoundedCapacity属性和CompleteAdding方法,它们都可以从某种方式上限制元素被加入到集合中。但BoundedCapacity是用来限制集合的最大容量,当容量已满后,后续的添加操作会被阻塞,一旦有元素被移除,那么阻塞的添加操作会成功执行。
在多线程环境下,使用BlockingCollection以及ConcurrentQueue来消费生产者生产的资源,这是我自己写的多生产者多消费者的作法,其实也是基于单个task下的阻塞队列的IsComplete来识别的。
Timer 计时器是在C#开发中经常用到的,但是有很多开发人员对他并不了解,今天这篇文将我们就具体讲解一下C#中的计时器。
在使用异步方法中最好不要使用void当做返回值,无返回值也应使用Task作为返回值,因为使用void作为返回值具有以下缺点
在.NET Core 3.0的版本更新中,官方我们带来了一个新的接口 IAsyncDisposable。
多线程操作集合时,ConcurrentQueue 是我常用的,一直用得也挺爽,突然发现了 BlockingCollection,原来还可以更简单。。。
刚才想了半天文章应该起什么名字,最后决定起名为《线程安全使用》,线程安全这个词很难理解,感觉就像托管这词一样,但是托管翻译成英文是managed,我通常把他翻译成被管理,这样就好理解多了,线程安全也是一样,可以理解为可以被多个线程同时使用的集合,而且同时使用的时候是该集合的值是准确的。
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表、集合和数组都不是线程安全的,若无同步机制,他们不适合于接受并发的指令来添加和删除元素。 在并发代码中使用上述经典集合需要复杂的同步管理,使用起来很不方便。 使用复杂的同步机制会大大降低性能。 NET Framework 4所提供的新的集合尽可能地减少需要使用锁的次数。这些新的集合通过使用比较并交换(compare-and-swap,C
Finalize自动释放资源,Dispose()用于手动释放资源。 释放类所使用的未托管资源的两种方式: 1.利用运行库强制执行的析构函数,但析构函数的执行是不确定的,而且,由于垃圾收集器的工作方式,它会给运行库增加不可接受的系统开销。 2.IDisposable接口提供了一种机制,允许类的用户控制释放资源的时间,但需要确保执行Dispose()。 一般情况下,最好的方法是执行这两种机制,获得这两种机制的优点,克服其缺点。假定大多数程序员都能正确调用Dispos
由于最近和数据库打交道,需要用C#和SQL Server 2005进行操作,就把近段时间内的最常用的操作做个总结.本人也是第一次用C#操作数据库,所以这三种典型用法对初学者还是挺有帮助的.
在.NET中所有的内建类型都继承自System.Object类型。在C#中,不需要显示地定义类型继承自System.Object,编译器将自动地自动地为类型添加上这个继承申明,以下两行代码的作用完全一致:
在对泛型的约束中,最常使用的关键字有where 和 new。 其中where关键字是约束所使用的泛型,该泛型必须是where后面的类,或者继承自该类。 new()说明所使用的泛型,必须具有无参构造函数,这是为了能够正确的初始化对象
本文告诉大家如何在 C# 里面使用汇编代码 请看 C#嵌入x86汇编——一个GPIO接口的实现 - 云+社区 - 腾讯云 C# inline-asm / 嵌入x86汇编 - 苏璃 - CSDN博客 通过这个方法在 dotnet core 获取 CPU 信息 [StructLayout(LayoutKind.Sequential)] internal ref struct CpuIdInfo { public uint Eax; public uint Ebx; public uint
GC作为.NET的重要核心基础,是必须要了解的。本文主要侧重于GC内存管理中的一些关键点,如要要全面深入了解其精髓,最好还是多看看书。
任何有经验的.NET开发人员都知道,即使.NET应用程序具有垃圾回收器,内存泄漏始终会发生。并不是说垃圾回收器有bug,而是我们有多种方法可以(轻松地)导致托管语言的内存泄漏。
.NET Framework的组成: (1)基础类库(BCL):使用线程的类来完成编程,对于不存在的类,就自己编写; (2)编译工具:将源文件,编译成“程序集”(exe或dll等)[.NET环境中,MSIL=CIL=IL] (3)公共语言运行时(CLR):执行前检测、编译;执行到了某个方法时才编译这个方法的代码[即时编译器(JIT)] 编译过程:.NET源代码(C#)——>通过C#编译器编译成程序集[程序集中包括:元数据(一个表,显示了程序中有什么成员,类,字段,方法等),IL代码等资源] 运行例子: (1)源代码如下: using System;
在C#中,IDisposable 是一个接口,用来提供一种机制来释放未使用的资源。当对象持有非托管资源(例如文件句柄、数据库连接、网络套接字等)时,需要实现 IDisposable 接口。
1.直接用Lua调用C#的方法 使用XLua输出HelloWorld 引入命名空间XLua,声明一个LuaEnv的类的对象,这个类提供了一些方法
资源管理(尤其是内存回收)曾经是程序员的噩梦,不过在.NET平台上这个噩梦似乎已经不复存在。CLR在后台为垃圾回收做了很多事情,使得我们现在谈起在.NET上进行开发时,都会说还是new一个对象吧!回收?有垃圾回收器呢。其实并没有这么简单。
Lua 5.4 正式发布了,很多朋友应该会比较好奇 Lua 5.4 与之前版本的区别,本文就此简单介绍一些 Lua 5.4 的新特性.
2、Debug.Write()和Trace.Write()之间有什么区别?二者分别应该用于何处?
链接:https://zhidao.baidu.com/question/559571801.html
面试出现频率:经常出现,但通常不会问的十分深入。通常来说,看完我这篇文章就足够应付面试了。面试时主要考察垃圾回收的基本概念,标记-压缩算法,以及对于微软的垃圾回收模板的理解。知道什么时候需要继承IDisposible接口,解构函数是做什么用的,什么时候需要自己写一个解构函数。
因为VFP出来时还没有.NET,所以VFP不支持.NET,C#编写出来的DLL控件需要转换成系统COM组件,才能够被VFP调用,当然不仅仅局限于C#与VFP之间的调用,各种语言都有自己写COM组件的方法。
对于C# 8,有吸引了大多数注意力的重大特性,如默认接口方法和可空引用,也有许多小特性被考虑在内。本文将介绍几例可能加入C#未来版本的小特性。
当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 首先,Dispose和Close基本上应该是一样的。Close是为了那些不熟悉Dispose的开发者设计的。因为基本上所有的developer都知道Close是干吗的(特别是对于那些有C++背景的developer)。 但是当我们写code时候,如果要实现Close和Dispose的时候,要注意Close和Dispose的设计模式。.net的
CodeSmith 创建Ado.Net自定义模版(三) 接上一篇: CodeSmith 创建Ado.Net自定义模版(二) 写数据访问层模版:Step3_DAL.cst (接口一这步在这套模版中省略,可以自行补充) 写几个通用方法,比如:得到全部实体集合、通过ID得实体、添加、删除、修改几个方法 我这里没有使用sqlhelper之类的帮助类 <%@ CodeTemplate Language="C#" TargetLanguage="C#" ResponseEncoding="UTF-8" Descri
本文来告诉大家如何在上一篇博客创建的窗口里面使用 Sharpdx 初始化,然后设置窗口颜色。
上一篇大致了解了一下单片机实际项目开发中上位机开发部分的内容以及VS下载与安装,按照编程惯例,接下来就是“Hello,World!”
本文转自:https://www.cnblogs.com/Mculover666/p/9126191.html
领取专属 10元无门槛券
手把手带您无忧上云