code gong
code
展开
-
.NET中的委托、事件、Invoke、lamdba、Aciton、Func
的控件(简单来说就是ui控件,如form、button等)执行者.Invoke(委托实例, 参数列表数组);事件机制:当事件被触发时,将会根据链接顺序。执行者必须为【本进程的主线程】的拥有窗体。:在非主线程或非本进程中执行修改ui的。NET的System命名空间提供了默认。使用lamdba简写class B。是一种限制性的委托,依赖于委托。(=> 读作 goes to)<>,绝大部分情况都够用了。上述Invoke示例代码。允许在函数体内编写一个。使用Action<>原创 2024-06-26 19:51:58 · 139 阅读 · 0 评论 -
C#多线程
到目前为止我们编写的程序是一个单线程作为应用程序的运行实例的单一的过程运行的。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。一个使用线程的常见实例是现代操作系统中并行编程的实现。使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率。线程生命周期开始于 System.Threading.Thread 类的对象被创建时,结束于线程被终止或完成执行时。类创建的线程被主线程的子线程调用。方法的使用,用于在一个特定的时间暂停线程。原创 2024-06-28 13:37:50 · 611 阅读 · 0 评论 -
.NET/C# 多线程下提升性能方法
c#中有一个Mutex类,就在System.Threading命名空间下,Mutex其实就是互斥量,互斥量不单单能处理多线程之间的资源竞争,还能处理进程之间的资源竞争,功能是比较强大的,但是开销也很大,性能比较低。你没看错,c#中的lock语法就是临界区(Monitor)的一个语法糖,这大概是90%以上的.net程序员首先想到的锁,不过大部分人都只是知道有这么个语法,不知道其实是以临界区的方式处理资源竞争。一般情况下,只要涉及到多线程编程,程序的复杂性就会显著上升,性能显著下降,BUG出现的概率大大提升。原创 2024-07-11 23:26:03 · 216 阅读 · 0 评论 -
.NET/C# 中的委托和事件
尽管并非必需,但是我们发现很多的委托定义返回值都为void,为什么呢?这是因为委托变量可以供多个订阅者注册,如果定义了返回值,那么多个订阅者的方法都会向发布者返回数值,结果就是后面一个返回的方法值将前面的返回值覆盖掉了,因此,实际上只能获得最后一个方法调用的返回值。可以运行下面的代码测试一下。除此以外,发布者和订阅者是松耦合的,发布者根本不关心谁订阅了它的事件、为什么要订阅,更别说订阅者的返回值了,所以返回订阅者的方法返回值大多数情况下根本没有必要。// 触发事件// 定义委托。原创 2024-07-11 22:44:34 · 653 阅读 · 0 评论 -
.NET/C# 线程相关概念
如果新线程恰好是任务管理器的线程(此时将会发现任务管理器可以响应,而任务管理器之外屏幕其他地方则仍然无响应),则用户可以利用任务管理器杀死包含了其他已经冻结的线程的进程。主要方式有:Thread.Join(其他线程都运行完了之后就解除阻塞),Thread.Sleep(时间到了就解除阻塞),Task.Result(得到结果了就解除阻塞),遭遇锁而拿不到锁的控制权(等到其他线程释放锁,自己拿到锁,就解除阻塞)等。只要存在可以调度的高优先级的线程,系统就永远不会将低优先级的现场分配给CPU,这种情况称为饥饿。原创 2024-07-11 22:24:03 · 830 阅读 · 0 评论 -
.Net线程同步
多个线程同时操作一个数据的话,可能会发生数据的错误。这个时候就需要进行线程同步了。原创 2024-07-13 17:38:17 · 5 阅读 · 0 评论 -
.Net 并发写入文件的多种方式
利用多线程写入文件存在的问题,以及解决方案.原创 2024-07-13 12:24:21 · 6 阅读 · 0 评论 -
消息中间件该如何选型
当问到“消息中间件如何选型”这个问题时,本质上是考察你对消息中间件的掌握程度以及你在团队中处于什么角色。所以,选型的前提是你要对需求和选型的竞品有足够的了解。原创 2024-07-07 12:28:10 · 877 阅读 · 0 评论 -
C# 委托(Delegate)
一个合并委托调用它所合并的两个委托。"-" 运算符可用于从合并的委托中移除组件委托。下面的实例演示了委托的声明、实例化和使用,该委托可用于引用带有一个整型参数的方法,并返回一个整型值。使用委托的这个有用的特点,您可以创建一个委托被调用时要调用的方法的调用列表。委托声明决定了可由该委托引用的方法。C# 中的委托(Delegate)类似于 C 或 C++ 中函数的指针。可用于引用带有一个字符串作为输入的方法,并不返回任何东西。上面的委托可被用于引用任何一个带有一个单一的。下面的实例演示了委托的用法。原创 2024-06-23 10:19:15 · 317 阅读 · 0 评论 -
并发编程-调度
新写的代码都不要使用这些过时的技术,使用 Task.Run 的代码更利于正确编写和日后的维护。.NET 中有几个不同的上下文,大多数 UI 框架有一个表示 UI 线程的 SynchronizationContext,ASP. NET 有一个表示 HTTP 请求上下文的 SynchronizationContext。也许你已经注意到了,前面的示例代码中,在 ConcurrentExclusiveSchedulerPair 的构造 函数中传入了 TaskScheduler.Default。原创 2024-06-23 17:42:25 · 1071 阅读 · 0 评论 -
并发编程-函数式OOP
现代程序需要异步编程,现在的服务器程序必须有更好的可扩展性,用户端程序必须有更好的交互性。开发者们意识到必须学习异步编程,他们在这个领域进行探索之后,发现异步编程经常会与已经习惯了的传统面向对象编程冲突。冲突的主要原因在于异步编程是函数式的(functional)。这里“functional”的意思并不是“具备功能”,它是一种函数式编程方式,而不是过程式编程方式。很多开发人员在大学里学习了基本的函数式编程,后来却很少使用。原创 2024-06-23 17:43:49 · 994 阅读 · 0 评论 -
并发编程-取消
取消采用协作方式,即可以请求某段代码取消,但不能强制它取消。如果某段代码本身不支持取消,就无法请求它取消运行。基于这个原因,建议大家在编写代码时尽量支持取消。取消是一种信号,包含两个不同的方面:触发取消的源头和响应取消的接收器。在 .NET中源头是 CancellationTokenSource,接收器是 CancellationToken。本章将介绍这两方面常规用法,还将介绍如何与非标准的取消模式进行互操作。取消被看作是一种特殊类型的错误。原创 2024-06-23 17:53:40 · 789 阅读 · 0 评论 -
并发编程-集合
虽然 AsyncProducerConsumerQueue 支持更多的平台,我仍建议大家尽可能使用 Buffer Block 或 ActionBlock,因为对 TPL 数据流库做过的测试比 Nito.AsyncEx 更加完整。方法的第一个参数是键。ImmutableList 是一种优秀的多功能数据结构,但因为有性能上的差异,不能盲目地用它来代替 List。不过,并不是每个平台都支持 TPL 数据流的,对那些不支持 TPL 数据流的平台来说, 选择阻塞队列是很适用的。原创 2024-06-23 17:55:08 · 906 阅读 · 0 评论 -
并发编程-互操作
有一种老式的异步编程模式,用的是 OperationAsync 方法和 OperationCompleted 事件。我们希望实现类似的操作,并且用 await 来等待返回的结果。使用 OperationAsync 和 OperationCompleted 的模式称为基于事件的异步模式 (EAP)。我们要把它们封装成返回 Task 对象的方法,并且让它符合基于任务的异步模式(TAP)。可以使用 TaskCompletionSource 类创建异步操作的容器。原创 2024-06-23 18:03:51 · 563 阅读 · 0 评论 -
并发编程-测试技巧
需要对 async 方法进行单元测试。现在大多数单元测试框架都支持 async Task 类型的单元测试,包括 MSTest、NUnit、 xUnit。从 Visual Studio 2012 开始,MSTest 才支持 async Task 类型的单元测试,因此需要将老版本升级到最新版本。单元测试框架检测到方法的返回类型是 Task,会自动 加上 await 等待任务完成,然后将测试结果标记为“成功”或“失败”。原创 2024-06-24 08:46:27 · 936 阅读 · 0 评论 -
并发编程-数据流基础
问题希望一些可重用的程序逻辑在自定义数据流块中使用。这有助于创建更大的、包含复杂逻辑的数据流快。解决方案通过使用 Encapsulate 方法,可以取出数据流网格中任何具有单一输入块和输出块的部分。Encapsulate 方法会利用这两个端点,创建一个单独的数据流块。开发者得自己负责端点之间数据的传递以及完成情况。讨论在把一个网格封装成一个自定义数据流块时,得考虑一下对外提供什么类型的参数,考虑每个块参数应该怎样传递进内部的网格(或不传递)。原创 2024-06-24 19:28:47 · 791 阅读 · 0 评论 -
并发编程-并行开发的基础
有一批数据,需要对每个元素进行相同的操作。该操作是计算密集型的,需要耗费一定的时间。解决方案Parallel 类型有专门为此设计的 ForEach 方法。在某些情况下需要尽早结束这个循环,例如发现了无效值时。更常见的情况是可以取消并行循环,这与结束循环不同。结束(stop)循环是在循环内部 进行的,而取消(cancel)循环是在循环外部进行的。需要注意的是,每个并行任务可能都在不同的线程中运行,因此必须保护对共享的状态。Parallel.ForEach 方法可以对一系列值进行并行处理。原创 2024-06-24 19:57:10 · 662 阅读 · 0 评论 -
并发编程-异步编程基础
一旦异步方法阻塞,调用它的线程就无法启动其他任 务,这会干扰程序的并发性,甚至可能产生死锁。如果有一个任务抛出异常,则 Task.WhenAll 会出错,并把这个异常放在返回的 Task 中。如果 T 是一个可变的引用类型,就必须在每次调用 IProgress.Report 时,创建一个单独的副本。这意味着,如果在 UI 线程中创建了 Progress,就能在 Progress 的回调函数中更新 UI,即使异步方法是在后台线程中调用 Report 的。如何实现一个具有异步签名的同步方法。原创 2024-06-24 20:02:34 · 839 阅读 · 0 评论 -
并发编程-基础介绍
异步编程有两大好处。第一个好处是对于面向终端用户的 GUI 程序:异步编程提高了响应能力。我们都遇到过在运行时会临时锁定界面的程序,异步编程可以使程序在执行任务时仍能响应用户的输入。第二个好处是对于服务器端应用:异步编程实现了可扩展性。服务器应用可以利用线程池满足其可扩展性,使用异步编程后,可扩展性通常可以提高一个数量级。现代的异步 .NET 程序使用两个关键字:async 和 await。原创 2024-06-24 20:08:43 · 666 阅读 · 0 评论 -
.Net ID4集合( 单点,redis ,Autofac,微服务)
在本文中,我们将介绍如何使用 Identity Server4 和 Redis 实现身份验证和访问控制。Identity Server4 是一个功能丰富、灵活且可扩展的开源身份验证和授权解决方案,而 Redis 是一个高性能的内存数据库,可用于存储和管理用户会话。IdentityServer4 是为Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证授权框架。原创 2024-06-24 21:12:48 · 905 阅读 · 0 评论 -
.NET高级调试Windbg调试入门篇
若要使用 WinDbg 提供的所有高级功能,必须加载适当的符号:比如说我们可以调试、查看.NET CLR程序堆栈,此时要加载对应的调试符号。Windbg调试器扩展是Windbg调试的精华和核心,可以这么说,掌握各类Windbg调试器扩展,你就掌握了各类调试技能。默认情况下,WinDbg的调试指令是有限的,通过一些WinDbg调试器扩展,可以方便我们进行.NET 程序调试。下载、安装、配置完成Windbg之后,接下来我们了解一下一些基本的调试命令。那么,首先我们先进行Windbg下载安装、配置。原创 2024-06-24 23:10:14 · 536 阅读 · 0 评论 -
C#实现异步的常用方式总结
是一种经典的异步编程模式,需要手动创建回调函数,用于处理完成或错误的通知。可以通过 IAsyncResult 设计模式的 Begin 和 End 方法来实现,其中 Begin 方法开始异步操作,而 End 方法在异步操作完成时执行,并返回异步操作的结果。需要注意的是,APM 模式通过 IAsyncResult 接口来存储异步操作的状态和结果,相对比较复杂,代码量也较大。需要注意的是,EAP 模式通过事件来实现异步编程,相对于 APM 模式更加简洁易懂,同时也避免了手动处理回调函数等细节工作。原创 2024-06-25 08:44:09 · 225 阅读 · 0 评论 -
C#实现异步方式
Task 类通常是以异步方式执行的单个操作,更适合在后台完成的一些小任务由于 Task 对象执行的工作通常在线程池的线程上异步执行,而不是在程序主线程上同步执行因此可以使用 Status 属性,还可以使用 IsCancele、IsCompleted 和 IsFaulted 属性来确认任务的状态大多数情况下,lambda 表达式用于指定的任务是执行的工作。一直等待到完成模式(wait until done):原始线程发起异步方法并做了一些其他处理后,原始线程中断并等待异步方法完成后再继续。原创 2024-06-25 08:44:55 · 391 阅读 · 0 评论 -
C# 中的 JSON 处理
我们还探讨了如何查询、筛选和操作JSON数据,以及如何处理复杂的嵌套JSON结构、日期和时间、特殊字符和转义序列、大量的JSON数据以及异常和错误情况。C#作为一种强大的编程语言,提供了丰富的工具和技术来处理和操作JSON数据。与将对象序列化为JSON字符串相反,C#中也可以使用System.Text.Json和Newtonsoft.Json来将JSON字符串反序列化为对象。当JSON中包含日期和时间类型的数据时,可以使用DateTimeOffset和JsonConvert类来进行正确的处理和转换。原创 2024-06-25 08:45:52 · 756 阅读 · 0 评论 -
C# 详细讲解23种设计模式
访问者模式最常见的应用场景是在对象结构比较稳定的情况下,需要对对象结构中的对象进行各种不同的操作,且经常添加新的操作。其中,上下文是一个包含状态的对象,抽象状态是一个定义所有具体状态的接口,具体状态是实现状态的具体类。命令模式是一种行为型模式,它通过将请求封装为一个对象来实现请求的发送者和接收者之间的解耦。命令对象包含了要执行的操作以及其相关的数据,可以把命令对象看成是一个操作的载体。在模板方法模式中,有一个抽象类定义了一些抽象的方法和模板方法,模板方法是一个固定的算法流程,而抽象的方法则需要子类去实现。原创 2024-06-26 19:56:06 · 446 阅读 · 0 评论 -
C#类修饰符有多少种,看到多少人说的全
抽象类是为了被继承的,而密封类是为了防止被继承的。static 和 abstract:静态类不能是抽象的,因为静态类不能被实例化,也就没有派生类的概念。static 和 sealed:虽然这两个修饰符本身不互斥,但通常不会同时使用,因为sealed用于防止继承,而static类本身就是不能被继承的。用于定义类的特性,控制类的可见性、继承、多态等。protected:受保护的访问修饰符,表示类只能在声明它的类或其派生类中被访问。,表示类不能被实例化,只能作为其他类的基类。,表示类是一个静态类,不能被实例化。原创 2024-06-29 09:32:23 · 902 阅读 · 0 评论 -
.Net5中实现Azuread +Oauth2 实现 SSO
Azuread +Oauth2 实现 SSO 单点登录目前实现比较多的一种方式Oauth2,以下将如何对接Azure的Oauth2分下面几个步骤实现。原创 2024-06-30 17:58:43 · 404 阅读 · 0 评论 -
C# 继承、多态性、抽象和接口详解:从入门到精通
要访问接口方法,接口必须由另一个类“实现”(有点像继承)。接口方法的实际方法体由“实现”类提供。要访问接口方法,接口必须由另一个类“实现”(有点像继承)。接口方法的实际方法体由“实现”类提供。通常,以字母 "I" 开头是一种良好的实践,因为这样可以更容易地记住它是一个接口而不是一个类。通常,以字母 "I" 开头是一种良好的实践,因为这样可以更容易地记住它是一个接口而不是一个类。中,可以将字段和方法从一个类继承到另一个类。注意:接口可以包含属性和方法,但不能包含字段。默认情况下,接口的成员是抽象和公共的。原创 2024-06-22 13:22:50 · 788 阅读 · 0 评论 -
什么是“托管代码”?
相反,如果运行 C/C++ 程序,则运行的代码也称为“非托管代码”。但是,请务必注意,如果采取这种方法,当代码越过运行时的边界时,实际的执行管理将再次交接到托管代码,因而需要遵守相同的限制。使用相应的编译器编译以这些语言编写的代码时,无法获得机器代码, 而是获得。在这种情况下,相关的运行时称为公共语言运行时 (CLR),不管使用的是哪种实现(例如。与此类似,C# 语言可让你利用所谓的不安全上下文(指定执行过程不由 CLR 管理的代码片段),在代码中直接使用非托管构造,例如指针。原创 2024-06-24 23:12:36 · 213 阅读 · 0 评论 -
.Net 清理未托管资源
但是,如果创建包含非托管资源的对象,则当你使用完非托管资源后,必须显式释放这些资源。最常用的非托管资源类型是包装操作系统资源的对象,如文件、窗口、网络连接或数据库连接。虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但无法了解如何发布并清理这些非托管资源。实现以释放非托管资源使用的内存。对于应用创建的大多数对象,可以依赖。然后,类型使用者可直接调用。方法的情况下阻止清理资源。方法的重写会在未调用。原创 2024-06-24 23:11:57 · 107 阅读 · 0 评论 -
net 自动内存管理
在执行第 0 级托管堆的首次回收并把可访问的对象升级至第 1 级托管堆后,垃圾回收器将考虑第 0 级托管堆的其余部分。例如,如果第 0 级托管堆的回收没有回收足够的内存,不能使应用程序成功完成创建新对象的尝试,垃圾回收器就会先执行第 1 级托管堆的回收,然后再执行第 2 级托管堆的回收。由于垃圾回收器只支持三个级别,因此第 2 级托管堆中未被回收的对象会继续保留在第 2 级托管堆中,直到在将来的回收中确定它们为无法访问为止。垃圾回收器执行第 0 级托管堆的回收后,会压缩可访问对象的内存,如本主题前面的。原创 2024-06-24 23:11:16 · 661 阅读 · 0 评论 -
高并发系统建设经验总结
前言早期从事运单系统的开发和维护工作,从最早的日均百万单,到日均千万单,业务的快速发展再加上外卖业务的特点是,业务量集中在午高峰和晚高峰两个高峰期,所以高峰期并发请求量也是水涨船高,每天都要面对高并发的挑战。拿运单系统来举例,日常午高峰核心查询服务的 QPS 在 20 万以上,Redis 集群的 QPS 更是在百万级,数据库 QPS 也在 10 万级以上,TPS 在 2 万以上。在这么大的流量下,主要的工作也是以围绕如何建设系统的稳定性和提升容量展开,下面主要从基础设施、数据库、架构、应用、规范这几原创 2024-06-26 19:51:25 · 699 阅读 · 0 评论 -
C# 继承、多态性、抽象和接口详解:从入门到精通
要访问接口方法,接口必须由另一个类“实现”(有点像继承)。接口方法的实际方法体由“实现”类提供。要访问接口方法,接口必须由另一个类“实现”(有点像继承)。接口方法的实际方法体由“实现”类提供。通常,以字母 "I" 开头是一种良好的实践,因为这样可以更容易地记住它是一个接口而不是一个类。通常,以字母 "I" 开头是一种良好的实践,因为这样可以更容易地记住它是一个接口而不是一个类。中,可以将字段和方法从一个类继承到另一个类。注意:接口可以包含属性和方法,但不能包含字段。默认情况下,接口的成员是抽象和公共的。原创 2024-06-27 08:39:43 · 518 阅读 · 0 评论 -
C#各种集合类和它们的用法
如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。但是,与数组不同的是,您可以使用索引在指定的位置添加和移除项目,动态数组会自动重新调整它的大小。当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素。它使用键来访问集合中的元素。当您使用键访问元素时,则使用哈希表,而且您可以识别一个有用的键值。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。原创 2024-06-28 13:29:27 · 366 阅读 · 0 评论 -
Task.Run 和 Task.Factory.StartNew 之间的区别
然而,在实际应用中,业务情况可能需要复杂的工作分配算法,需要我们自己的任务调度机制。例如,我们可能想要限制并发任务的数量。提供了一种方法来避免由于委托中的 lambda 变量捕获而导致的闭包和内存分配,因此可能会带来一些性能提升。因此,如果某个任务使用的内存分析表明传递状态对象会带来显着的好处,我们应该。但是,如果我们检查下面发生的事情,我们会发现明显的差异。尽管在这个最简单的示例中这不是显着的开销,但在涉及许多变量的复杂例程中,这可能是一个主要问题。因此,在我们的示例中,两个版本显然都在做同样的事情。原创 2024-06-28 13:20:26 · 550 阅读 · 0 评论 -
.NET中如何在同步代码块中调用异步方法
在同步代码块中直接访问 Task 的 Result 属性,这会阻塞调用线程直到返回Result为止。在同步代码块中调用异步方法,方法有很多。原创 2024-06-28 13:23:05 · 118 阅读 · 0 评论 -
.Net HTTP 请求封装代码
有了这些方法请求第三api接口就不用慌了,拷贝就可以用了。2)Form表单POST请求泛型接口。4)Json参数POST请求泛型接口。3)Form表单POST请求。5)Json参数POST请求。1)POST请求泛型数据。3)Get请求返回文件流。1)GET请求泛型数据。原创 2024-06-30 16:24:48 · 159 阅读 · 0 评论 -
C#中多线程中变量
在多线程中,每个线程都是独立运行的,不同的线程有可能是同一段代码,但不会是同一作用域,所以不会共享。线程变量:每个线程只能访问自己的那个拷贝,其他线程不可见。多核CPU可以执行多任务,但是单核CPU也可以执行多任务,CPU是顺序执行的,操作系统让任务轮流执行,例如:听歌执行一次,停顿0.01s,写文档执行一次,停顿0.01s等等。】,运行结果打印出来,值都是一样的,增加的都是每个线程都访问单独的tempi变量。写多线程的时候需要注意,变量的作用域,否则程序运行出来的结果将不会是想要的结果,注意变量作用域。原创 2024-07-04 13:01:12 · 318 阅读 · 0 评论 -
C# Task.Run 和 Task.Factory.StartNew 区别
Task.Run 是在 dotnet framework 4.5 之后才可以使用,但是 Task.Factory.StartNew 可以使用比 Task.Run 更多的参数,可以做到更多的定制。可以认为 Task.Run 是简化的 Task.Factory.StartNew 的使用,除了需要指定一个线程是长时间占用的,否则就使用 Task.Run。Task.Run和Task.Factory.StartNew里面有异常的时候都是不会抛出来的,所以需要捕获异常。在线程内捕获异常,这是正确的写法。原创 2024-07-04 12:52:41 · 239 阅读 · 0 评论 -
使用 ASP.NET Core 和 MongoDB 创建 Web API
如果使用的是 Windows,MongoDB 将默认安装在 C:\Program Files\MongoDB 中。来确定适用于 MongoDB 的 .NET 驱动程序的最新稳定版本。选择“.NET Core”目标框架和“ASP.NET Core 3.0”。通过上述更改,Web API 的序列化 JSON 响应中的属性名称与 CLR 对象类型中其相应的属性名称匹配。如果它不存在,则将创建名为“BookstoreDb”的数据库。选择“ASP.NET Core Web 应用程序”项目类型,然后选择“下一步”。原创 2024-07-04 13:19:18 · 892 阅读 · 0 评论