- 博客(59)
- 收藏
- 关注
原创 多线程,多线程同步,多线程通信
-非阻塞性,当遇到await时,方法挂起执行(释放线程去做其他事),等异步操作完成后再来执行剩余代码。--建立在Task,即async/await -> Task -> ThreadPool。--资源复用 --适合大量短时,轻量级任务 --调度不灵活,对线程池的控制有限。(比如IO操作),那么await不会卡住当前线程,任务会在后台执行,完成后再回到await后面继续执行。--无需管理 --便于调度组合,可以轻松完成任务链 --依赖于线程池。--控制精细(设置线程优先级,生命周期等)
2025-03-05 14:37:27
232
原创 温故而知新:异步与多线程,回调函数
在非阻塞异步中,线程会立刻返回,继续执行下去(你可以想成新开了一个Task.run去跑这个方法,因为非阻塞异步实际上就是Task.run机制)的区别在于,这个是用的线程池管理,对比新开线程会节省一点资源(更加高效),其他都是一模一样的。(Task.run机制,对Task不是新开线程,是从线程池子中找空闲线程去跑任务)跟用去。2.执行回调:在某个时刻,当事件或操作完成时,调用传入的回调函数。异步任务的完成,并且通常通过async和await来标记。调用方法时,它并不会等待方法执行完毕,而是直接返回,
2025-01-03 11:27:24
239
原创 回调复习,以及关于面向接口编程
好的,接下来,就是BusinessActivityXDCBase,它是继承自BusinessActivityeCATBase的,因此在调用它的构造参数前,会先调用基类的构造参数,我们看看BusinessActivityeCATBase的定义如下。再来调用子类的构造函数。回到BusinessActivityXDCBase的无参构造函数,那么它就是实例化了一个一个xdcMsgMgr,然后调用了它的属性oXDCReceiveMsgMgr,我们来看看oXDCReceiveMsgMgr的定义。
2024-11-20 11:44:46
932
原创 关于电脑在输入时跳窗口/窗口失去焦点 的解决方法
最近在公司电脑用输入法时,总是会失去焦点,窗口内容在输入一半时就会跳到别的窗口,于是写了个软件监控一下到底是哪个小可爱在抢夺窗口的控制权。然后继续做输入,果然发现了,是WPS2016在捣乱,真是个小可爱,果断卸载,解决问题。代码如下:在界面上记得加个label,并修改名称为lblProcessInfo。环境:winform4.7.2。
2024-11-11 09:37:55
209
原创 继承与静态
1)实例成员:包括实例方法和实例属性,实例字段,会被子类继承,子类可以重写(override)或隐藏(new)这些成员,如果子类没有重写,它会继承基类的方法和属性,并能直接访问(访问级别为:protectd或者public的)。,不能被实例化对象继承,如果子类定义了同名的静态方法,它会隐藏父类中的同名静态方法(通过new关键字)。3)构造函数:构造函数也不能被继承,子类需要定义自己的构造函数,子类在实例化时,会。3)构造函数:子类不能继承父类的构造函数,但是必须要调用父类的构造函数,如果没有用。
2024-11-08 13:29:56
230
原创 new 关键字 (2)
3.1 override是重写父类的方法,完全取代掉父类的方法,使用override的父类方法必须标记有virtual关键字。此时用子类的实例赋值给父类的引用,得到的会是override重写后的方法。3.3 这里补充一点,孙子类如果继承自Child,也是会继承到Partent上这个被隐藏掉的方法的,仍然可以用Parent的实例得到这个被隐藏起来的方法。3.2 new也可以重写父类的方法,但是父类的方法仍然存在,只是被隐藏掉了。此时将子类的实例赋值给父类的引用,得到的会是被隐藏掉的方法。
2024-11-08 10:25:17
140
原创 常用的TASK方法
与TASK.WaitALL不同的是,它不会阻塞线程,而是返回一个任务,当所有任务都完成时,这个返回的任务就会完成。与TASK.WaitAny类似,但是不会阻塞当前线程,而是返回一个任务,该任务会在至少有一个任务完成后完成。,在任务A后面接上任务B时,就可以使用 TASK A .ContinueWith TASK B。阻塞当前线程,直到至少有一个任务完成。可以用来等待一组任务完成,
2024-10-10 14:14:34
200
原创 this 关键字
方法体内的id,一定是指最近的作用域,即形参里的id,此时如何去指定外部的字段id呢?就可以用this指代类Person,从而指定它的字段。时,可以用this指代该类Point (同样的还有base()继承父类的构造函数,这里this()是调用该类中的已存在的构造函数)通过this可以拓展构造方法,传入一些必要的参数,注意执行顺序,先执行继承的构造函数。其实this就是相当于一个引用,指向的是该类的实例;1. 指代类或结构体本身。3.可用于扩展方法的声明。
2024-09-25 15:16:33
251
原创 托管与非托管资源
using的对象必须实现IDisopsable接口(包含Dispose方法),自动调用dispose释放资源。Windows句柄:Windows API调用产生的句柄,如:xxHandle。硬件资源:与外部硬件设备的交互,需要手动释放,如:SerialPort。COM对象:与外部系统(如Excel)交互时,COM对象需要使。托管资源是指受 .NET垃圾回收器(GC)管理的资源。图形资源,如:Bitmap、Pen、Graphics。using: using是处理非托管资源的一种。垃圾回收的方法,用于让GC。
2024-09-25 10:33:55
397
原创 归纳一下Invoke,beginInvoke,还有InvokeRequire
InvokeRequire:判断当前的使用控件的操作是否来自非UI线程,如果为True,则需要用Invoke或者BeginInvoke调起UI线程。Invoke的另一个作用是,调用委托。:异步调用委托,调用后不会等待该方法执行完成,而是继续执行代码,适用于异步操作。:立即执行委托所指向的方法,并等待该方法执行完成(同步)。,直接调用是无法实现的,必须通过反射来动态调用。:同步调用,当前代码不在UI线程上执行时,会。:异步调用,它也会将操作切换到UI线程,但。,不会等待操作完成,调用线程会立即继续执行。
2024-09-23 11:01:57
493
原创 常见的泛型集合
使用泛型类存储数据,提供了类型安全和性能的改进,是 C# 2.0 之后的首选集合类型。是先进先出(FIFO-先进先出数据缓存器)的集合。它用于在你需要按顺序处理对象时使用。类型存储元素,因此需要进行类型转换,可能导致运行时错误和性能损失(装箱和拆箱)。是最常用的泛型集合,它类似于动态数组,可以存储任意数量的元素。是后进先出(LIFO)的集合。它用于需要按逆序处理对象时使用。是存储多个对象的结构。,在 C# 2.0 之前常用,但由于它们使用。是一种键值对的集合,允许你根据键来存取值。
2024-09-14 10:02:13
360
原创 事件和委托,Lambda表达式
关键字用于定义事件,它封装了委托,不允许在外部直接调用,只能由定义事件的类触发。.Invoke("任务完成!是在Publisher发布者类内。事件允许一个对象(发布者)通知其他对象(订阅者)发生了某个动作。是一种简洁的匿名方法写法,可以用来定义内联方法或传递给委托和事件处理器。格式:(parameters) => expression。FUNC和ACTION型委托,它们都用于简化委托的使用。是一个内置委托类型,表示一个接受两个。Lambda 表达式。,其实就是方法的引用。
2024-09-12 15:14:10
294
原创 托管和非托管
托管环境中,内存管理和资源控制由运行时环境自动处理。比如.NET的CLR,和Java的JVM。开发者不需要手动管理内存的分配和释放,这些任务由托管环境负责。非托管环境中,内存管理完全由开发者手动控制,开发者需要精确的分配和释放内存。但会拥有更高的性能和控制。1.自动内容管理:C#依赖垃圾回收机制(GC),自动处理对象的创建,管理和释放,避免内存泄露。托管和非托管主要是指内存管理和资源控制方式的不同,
2024-09-11 14:52:24
257
原创 区别异步和多线程、线程同步机制、理解Task的实现
1、通过创建多个线程并行执行任务,每个任务都可以独立运行并充分利用多个 CPU 核心。表现:暂停期间,线程空闲出来可以处理其他任务,等异步任务完成后,程序会。任务在等待I/O(网络、文件)时,不会阻塞其他任务的执行。2、在某些场景下(如大量计算),多线程执行可以真正地实现任务并行处理。解释:任务1和任务2在各自的线程上并行运行。当前线程可以去执行其他任务,而不是被“卡住”在某个等待操作上。异步阻塞,程序执行继续,完全没影响。3、适合I/O密集型任务,如网络请求,数据库查询等。,等待3秒后继续,程序“卡住”
2024-09-05 18:28:55
370
原创 常用网络协议理解
应用:适合需要可靠传输的应用,如文件传输,实时语音等。低层次:需要手动处理数据的序列化和反序列化,数据的发送和接受,连接管理等。的序列化/反序列化(通常是 JSON),并且有内置的路由、认证、授权等功能。UDP协议: 使用用户数据报协议 (UDP) 提供无连接、尽力而为的通信。特性:不保证数据的顺序和完整性、没有连接和断开的过程。协议的作用,就是用于双方规范数据格式,以及规定数据如何在网络中传输。特性:保证数据的顺序和完整性、有连接和断开的过程。使用传输控制协议 (TCP) 提供可靠的、面向连接的通信。
2024-09-05 16:37:49
635
原创 策略模式实现搜索功能
假设你有一个功能需要多种不同的算法或行为实现(如不同的排序方式、不同的支付方式、不同的搜索方式等),这些行为是相似的。将这些可变的行为封装为不同的策略累,并定义一个接口来规范这些策略的实现。1、替换不同的算法:可以根据需要动态的选择不同的算法或实现。1、策略接口(Strategy Interface):定义所有策略类必须实现的方法。3、提高可扩展性:新增一种行为时,只需要添加一个新的策略类,而不需要修改现有的代码。2、实现具体的策略类,由于搜索条件有可能同时满足,所以定义组合策略类。2、实现具体的策略类。
2024-09-05 15:03:56
551
原创 SQL注入
直接在sql语句中,使用OperatorName和OperatorPassword容易遭受sql注入,例如。然后后面的 -- 会被转化为sql语句的一部分,-- 又是注释符号,所以会屏蔽后面的密码查询部分,在第一段代码里,当我输入的用户名为 admin'-- 时,系统会将 ' 视作一个sql语句的变量,即任意密码都可以登陆系统。所以在做sql查询时,要注意防止sql注入。
2024-09-02 11:34:23
295
原创 MVVM2
每个WPF控件(包含窗体)都有一个DataContext(数据上下文),集合控件(ListBox,DataGridView)有一个ItemsSource属性用于控件绑定数据。保存数据的集合是 ObservableCollection<>(Observable:可观察者、被观察者)。也就是说数据是被观察的对象,WPF窗口就是观察者。MVVM实现的就是将前后台更好的分离开来。模型(Model)、视图(View)、视图模型(ViewModel)。GUI事件:在图像界面中,与用户交互有关的事件。
2024-09-02 09:58:23
233
原创 多线程资源占用问题
数据库资源: 多线程并发访问和修改同一数据库记录(缺乏事务控制或锁定机制),多个线程或进程使用数据库连接资源时,可能导致连接超时或连接耗尽。·网络资源:同时范文或操作同一个网络套接字(如发送和接受数据)可能会引发冲突,导致数据包丢失或混乱;内存映射文件(内容映射到进程的虚拟地址中)、临时文件缓存(本地副本文件)、内存流(内存中(堆)划一块区域存储临时文件)·内存资源: 多线程同时访问或修改静态(全局)变量时可能引发竞争条件,导致数据不一致出错。对于数据库资源可能存在的高并发访问的场景,应该使用数据库。
2024-08-27 16:43:18
568
原创 依赖注入(DI)
依赖注入容器可以帮助自动管理对象的创建和注入。例如,在 ASP.NET Core 中(或EF Core中使用比较频繁),依赖注入是一种设计模式,将对象的依赖关系从内部转移到外部管理。(常用于ASP.NET Core 中或EF Core中)也可以这样理解,容器会自动帮我们解析依赖关系,并创建相应的实例。属性注入通过公开属性的方式,将依赖对象设置到类中。接口注入通过接口方法将依赖对象传递给类。构造函数注入,属性注入,接口注入。是一个典型的依赖注入容器。解耦,可测试性,可维护性。
2024-08-27 15:44:20
197
原创 SqlHelper 使用EF-Core框架 连接池处理并发
AddAsync(T entity) T是泛型类型的参数,它使得这个方法可以处理任意类型的实体对象。Task 当一个 方法的返回类型是Task时,表面这个方法是异步的,但它不返回任何值(即它是'void'的异步版本,同理int的异步版本为Task)。await 在异步操作中使用,会暂停当前方法的执行(阻塞当前线程),直到方法执行完成后,才会继续执行下面的代码,暂停期间,控制权会返回给调用方(如UI线程)async 表方法内可能包含异步操作,允许方法在内部使用"await"
2024-08-26 11:18:55
352
原创 try-catch-finally的使用技巧
finally是一定会执行一次,无论try里面是否有代码存在,try包含的代码块里,所有的异常都会被catch捕获。:如资源释放、状态恢复等操作,应该放在。块中,以保证无论是否发生异常都能执行。finally的使用例子,释放锁资源。
2024-08-23 18:13:56
157
原创 vs编程快捷键
testmethod 生成单元测试框架(NUnit)位置:位于工具>代码片段管理器>语言选中CSharp。propvn 生成数据注释的属性,用于模型验证。propful 完整属性 (包含私有字段)propg 生成属性,并自动创建。ctor 创建类的构造器。propdp 依赖属性。dp 简化的依赖属性。prop 自动属性。
2024-08-23 15:48:28
159
原创 记录一下在IIS上部署服务器上遇到的一系列问题及解决方案
①首先,发布完的一整个文件夹,要Copy到 C:\inetpub 目录下,然后再iis中,添加的物理路径要选中这个文件夹,如:C:\inetpub\testapi。②给予文件夹访问权限,右键testapi文件夹,属性,安全,编辑,添加,高级,立即查找,选中everyone,确定。④在iis管理器页面,找到网站下面的testapi,找到模块,双击模块进入,移除掉WebDav模块,它会阻止httpput和httpdelete请求。③发布目录时,文件发布选项中,不要勾选 生成单个文件,不然会报错。
2024-08-21 14:16:33
649
原创 单例模式的实现
为什么单例能保证线程安全:在下面例子中,静态属性DeviceManage.Instance 是在 程序加载时 初始化的,且只会 初始化一次,确保软件整个生命周期内,只有一个 DeviceManage.Instance 实例存在。2.互斥访问:DeviceManger 类的方法,字段和构造器都是私有的,因此外部无法直接修改_device字典,内部方法又是可控的(可以通过Lock),这样可以避免多个线程同时修改_Device 引起并发问题。2.资源管理 (数据库连接池,文件系统管理器,线程池)
2024-08-20 09:45:34
456
原创 HTTP协议中常用的请求方法
概念:从服务器获取数据,它是无副作用的请求,不会修改服务器上的任何资源。概念:将数据发送到服务器进行处理,通常用于创建资源或提交表单。概念:用于更新服务器上的现有资源,如果资源不存在,则创建它。适用场景:获取数据,如网页内容,读取数据库中的记录等。适用场景:更新数据,如更新用户信息或替换资源。适用场景:删除资源,如删除记录,删除文件等。>请求体中包含数据,可能是复杂文件或对象。适用场景:创建新资源,上传文件等。>无长度限制,适合大量数据传输。>更新数据,包含数据在请求体中。概念:用于删除服务器上的资源。
2024-08-19 11:15:49
155
原创 区分 is true 和 == true
关键字通常用于类型检查,特别是在模式匹配中。这里它被用于检查 check 是否是布尔类型并且值为。在C#中,有两种用于语句检测的语言。: 适用于任何布尔类型的变量。或其他类型),它将返回。是否是布尔类型,如果。,编译时会抛出错误。
2024-08-19 10:23:37
267
原创 PacsWebServer
工具:C# ASP.NET CORE WEB API .NET 5.0 EF-CORE EF-CORE.SqlServer EFCORE.Tools。用途:接受客户端传过来的指令,并生成对应的DICOM文件,且将DICOM上传到PACS系统。
2024-08-19 09:56:39
97
原创 记录一些小知识
这肯定是不被允许的,需要将DicomFunc(dicomRequest)包装成Action委托,再传Task的话,Task就会收到一个。而我想传入DicomFunc(dicomRequest),本来意思就是要传入一个委托,但是实际是,一个方法DicomFunc(dicomRequest),这个方法返回一个void,所以就变成了。的方法,用lambda表达式可以做到这样的。这里Task需要的是一个Action委托。
2024-08-16 11:09:17
144
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人