2021-09-28 14:47:04
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。程序如下: private void button1_Click(object sender, EventArgs e)
{
var list1 = new List<int>();
for(int i=0;i<10000...
2021-09-28 14:17:17
勇哥注:《多线程安全》这个系列会持续写下去,它是我的一个弱点,有兴趣的朋友可以选择性看看。运行源码后,执行button1 for (int i = 0; i < 5; i++)
{
var k = i;
//加上下面这句效果又不一样
Task.Run((...
2021-09-25 16:51:17
勇哥注:关注这个话题是因为看到C#的关键字 lock时,其传入引用对象。因为string也是引用对象,所以能否做为lock的参数?对于这个问题,要搞明白C#的字符串的一个特点,它使用类似于享元模式的机制。因此在lock中锁字符串是相当不安全的。下面贴子是对C#字符串与享元模式的深入讨论。写这个文章,主要是因为网上对C#字符串和享元模式的误解比较多。Flyweight模式先说这名字,fly呢,就是苍...
2021-09-22 10:28:23
勇哥手里一个无刷电机,采用485的modelbus crc16协议来控制。因此需要一个计算校验和的工具。源码:using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
us...
2021-09-18 11:02:12
勇哥注:以下是机译版本,可以对照英文原版看。对.net程序调试有兴趣童鞋,不要错过这份文档,是非常好看的。法律信息 这是一份初步文件,可能会在此处描述的软件最终商业发布之前进行重大更改。 本文档中包含的信息代表 Microsoft Corporation 在发布之日对所讨论问题的当前看法。由于 Microsoft 必须响应不断变化的市场条件,因此不应将其解释为 Microsoft 的承诺,并且 M...
2021-09-17 21:57:22
捕获变量时,会创建一个包装类例子: 1: static void Main(string[] args)
2: {
3: Console.WriteLine("Variable Capturing");
4:
5: string name = "Matthew";
6: Fun...
2021-09-17 20:40:11
勇哥注:虽然C#有GC机制,但是内存泄露仍然是.net程序常见的问题。有兴趣的童鞋和我一起学习下这方面的内容吧。C# 内存泄露学习笔记(1)静态集合引发示例 :using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.In...
2021-09-17 16:57:43
目录介绍究竟什么是事件?第 1 部分:侦听器端弱事件解决方案 0:只需注销解决方案 1:当事件被调用时注销解决方案 2:弱引用的包装器解决方案 3:在终结器中注销解决方案 4:可重复使用的包装器解决方案 5:WeakEventManager第 2 部分:源端弱事件解决方案0:接口解决方案 1:对委托的弱引用方案二:对象+转发器解决方案 3:SmartWeakEvent解决方案 4:FastSmar...
2021-09-17 16:45:17
转载自:https://michaelscodingspot.com/5-techniques-to-avoid-memory-leaks-by-events-in-c-net-you-should-know/ C#(以及一般的 .NET)中的事件注册是内存泄漏的最常见原因。至少从我的经验来看。事实上,我从事件中看到了如此多的内存泄漏,以至于 在代码中看到 +=立即让我产生怀疑。虽然事件是伟大的,...
2021-09-17 16:13:16
勇哥注:此文转载自:https://michaelscodingspot.com/find-fix-and-avoid-memory-leaks-in-c-net-8-best-practices/任何从事过大型企业项目的人都知道内存泄漏就像大酒店里的老鼠。当它们很少时,您可能不会注意到,但是您必须始终保持警惕,以防它们人口过多,闯入厨房并在所有东西上大便。查找、修复和学习避免内存泄漏是一项重要技...
2021-09-17 11:02:46
1. 什么是.Net内存泄露(1).NET 应用程序中的内存您大概已经知道,.NET 应用程序中要使用多种类型的内存,包括:堆栈、非托管堆和托管堆。这里我们需要简单回顾一下。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的代码称作非托管代码。COM 组件、ActiveX 接口和 Win32 API 函数...
2021-09-16 14:29:46
勇哥注:大家都知道在window里,进程之间通讯可以用消息通讯。但是有个较冷门的知识就是RegisterWindowMessage。一般的sendmessage和postmessage是需要在窗体程序间进行通讯,你得知道对方窗口的句柄。这个句柄每次启动程序时是系统分配的,每次不一样。有了这个RegisterWindowMessage,两个进程可以共同持有一个相同的“句柄”,然后两者的顶层窗体间可以...
2021-09-11 19:11:23
一:背景1. 讲故事2. windbg验证一下二:对GC代机制的理解1. CLR堆模型2. 对临时内存段的解释<1> 为啥小对象堆中有一个临时内存段?<2> 临时内存段大小是多少?3. 代机制简介三:代机制原理的代码演示1. 探究 gen0 上的student1 和 studnet22. 探究 student1 被消灭,student2进入gen13. 探究student2...
2021-09-09 08:14:25
!heap!heap 扩展显示堆使用信息,控制堆管理器中的断点,检测泄露的堆块,搜索堆块或者显示页堆(page heap)信息。语法Windows NT 4.0的语法!heap [HeapOptions] [ValidationOptions] [Heap] !heap -b [{alloc|realloc|free} [Tag]] [Heap | BreakAddress] !heap -B {...
2021-09-08 08:13:21
经过两个多小时的google和试探,终于搞定了一段代码.通过这个代码可以控制当前线程的CPU使用量.下面是代码:using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Runtime.InteropS...
2021-09-06 11:16:12
sender as ObservableCollection<string> 为啥为null ? 查看下sender的传入值,确实是有内容的。查看下sender的定义如下,确实是一个ObservableCollection<string>类型。用即时窗口看下:sender is List<string>
false
sender is ObservableC...
2021-09-02 21:06:53
尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序。同时,还需要具备一些基础的内存管理工作机制的知识,这样能够有助于解释我们日常程序编写中的变量的行为。在本文中我将讲解栈和堆的基本知识,变量类型以及为什么一些变量能够按照它们自己的方式工作。在.NET framework环境下,当我们的代码执行...
2021-09-02 20:55:26
(一)一些相关指令的测试【线程池耗尽】!threadpool 能看到完成端口,线程池工作线程和timer回调各占线程池的情况。0:000> !threadpool
CPU utilization: 6%
Worker Thread: Total: 8 Running: 4 Idle: 4 MaxLimit: 32767 MinLimit: 12
Work Request in Queu...
2021-09-02 19:18:30
勇哥注:最近开发的软件遇到一些问题,主要是爆cpu时间,这样的后果是软件运行时间一长就会越跑越慢,最终UI失去响应。用vs来排除,目前只知道对可疑代码进行失能,再配合任务管理器观察 :cpu使用率, cpu时间,线程,句柄等参数来判断可疑代码是不是有问题。如果搜索一下网络,貌似这个问题大部分答案只是对线程做sleep,没啥子可用的信息。因此是时候涨点知识了,我把学习方向放在用WinDbg调试用户模...
2021-09-02 18:48:35
勇哥注:最近开发的软件遇到一些问题,主要是爆cpu时间,这样的后果是软件运行时间一长就会越跑越慢,最终UI失去响应。用vs来排除,目前只知道对可疑代码进行失能,再配合任务管理器观察 :cpu使用率, cpu时间,线程,句柄等参数来判断可疑代码是不是有问题。如果搜索一下网络,貌似这个问题大部分答案只是对线程做sleep,没啥子可用的信息。因此是时候涨点知识了,我把学习方向放在用WinDbg调试用户模...
2021-08-26 10:47:13
勇哥注:微软又整出一堆新概念,咱们只能了解一下扫下盲,就学习精力而言,年轻人才是未来。。。.当今 net 生态系统如下: 从上面图中我们可以看到.net 主要分为三个部分 .net FrameWork,.net Core ,XamarinXAMARIN 主要用来构建APP的(包括IOS,Android Windows)主要用的是C#语言The .NET Framework 这个是我们现在经常...
2021-08-02 14:34:12
本文转载自k_set原创内容点击打开链接WinForm加载多个自定义控件时,会出现很严重的闪烁问题,很卡,一块一块的加载(像打开网页时,网络很卡的那种感觉)简直没法忍受。在网上搜索了好久,网上大部分的方法是一下4种,但是都不能有效的解决问题。 1.将DoubleBuffered 设置 true,用双缓存处理Form界面内容加载,可以提高页面显示质量。或者SetStyle(ControlStyle...
2021-07-30 08:03:39
勇哥注:事件很常见,但有重复的代码量。如果你想简化一下事件的编程,而且是整个程序只使用一个像事件池一样的东西,可以尝试使用下文讲的ObservableCollection观察者集合来做到。ObservableCollection<T>类表示一个动态数据集合,在添加项,移除项或刷新整个列表时,刺激和将提供通知通知可以由下面的枚举知晓你对集合做了什么才触发的事件。using System;...
2021-07-30 08:00:26
对一个服务器程序想统计每秒可以处理多少数据包,要如何做?答案是用处理数据包的总数,除以累记处理数据包用的时间。这里要指出的是, 运行一段程序,使用的cpu时间,跟实际运行的时间是不一样的。附例如下:private void ShowRunTime()
{
TimeSpan ts1 = Process.GetCurrentProcess().TotalProcessor...
2021-07-29 16:33:48
勇哥注:.Net的Stopwatch类可以精确到1/10000毫秒, 有没有更精确的计时吗?见下面的代码。暂时没试过效果,大家可以试下。计算某个代码片段的执行时间,精确到CPU执行一条指令所用的时间(十亿分之一秒),可用于精确计算某个算法的执行时间。代码:using System;
using System.Runtime.InteropServices;
using System.Compo...
2021-07-29 16:16:38
正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下:System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew(
(object mystate) =>
{...
2021-07-29 13:32:41
勇哥注:我在用Task的时候,它处理完毕后,还能检测到它下图的这些状态。于是在想,Task处理完毕后是否需要做清理工作呢?正好今天看到一个博主聊到这个话题。传送门:异步编程系列目录…… 摘要:本博文解释在.NET 4.X中的Task使用完后为什么不应该调用Dispose()。并且说明.NET4.5对.NET4.0的Task对象进行的部分改进:减轻Task对WaitHandle对象的依赖,并且增强在...
2021-07-29 11:54:34
勇哥注:大家好,我是微软的搬运工,今天搬一个忽略的知识点。索引器允许类或结构的实例就像数组一样进行索引。 无需显式指定类型或实例成员,即可设置或检索索引值。 索引器类似于属性,不同之处在于它们的访问器需要使用参数。以下示例定义了一个泛型类,其中包含用于赋值和检索值的简单 get 和 set 访问器方法。 Program 类创建了此类的一个实例,用于存储字符串。using System;
cl...
2021-07-28 16:12:31
勇哥注:这位博主总结了来自于视频的一些学习资料,感谢他的分享,内容是相当经验化的总结。文章很长,有空我会做些排版,先凑合着看吧。#线程详解1. Thread基础之从 WinDbg 角度理解你必须知道的时间和空间上的开销一:空间上的开销1、thread本身来说就是操作系统的概念。。。<1> thread的内核数据结构,其中有osid,context => CPU寄存器的里面的一些变...
2021-07-27 10:19:59
勇哥要做到的目标是:task工厂按添加的顺序依次执行。下面程序我规定的顺序为: A...A...B...B...C...C...从源码一来看,每次执行次序都不同。如果我们把lock那段代码启用,效果如下:可以看到仅保证了两次输出是连续,而不能保证执行顺序跟task工厂add的顺序一样。代码还有一个问题是:myScheduler调度器并没有发挥作用,twork根本执行不到。以上问题的解决版本见后面...