- 博客(19)
- 收藏
- 关注
原创 Task 的最佳实践和技巧
可以使用 ContinueWith 方法在一个任务完成后执行另一个任务,但要注意它的使用场景,因为 async 和 await 通常是更好的选择。在异步方法中,应避免使用阻塞操作(如 Thread.Sleep 或 Task.Wait),因为这会破坏异步编程的优势,导致线程阻塞。当需要并行执行多个独立的异步任务并等待所有任务完成时,使用 Task.WhenAll。除了事件处理程序,异步方法应返回 Task 或 Task。如果只关心多个任务中最先完成的那个,可以使用 Task.WhenAny。
2025-02-17 14:36:57
702
原创 C# 中,Thread 和 Task区别
Task:Task 提供了丰富的任务管理和控制功能,例如可以使用 ContinueWith 方法在任务完成后执行后续操作,使用 WaitAll 或 WaitAny 方法等待多个任务完成,还可以使用 CancellationToken 来取消任务。对于需要长时间运行且独立于其他任务的后台任务,使用 Thread 可以确保任务在单独的线程中持续运行,不会受到其他线程或任务的干扰。Task:Task 通常使用线程池中的线程来执行,线程池会对线程进行复用,减少了线程创建和销毁的开销,提高了性能。
2025-02-17 14:16:18
669
原创 C# 系统编程中,提高系统实时性
可以使用无锁数据结构,如ConcurrentDictionary<TKey, TValue>来减少锁的使用。利用多核处理器的并行计算能力,可以显著提高程序的处理速度。async和await关键字可以简化异步编程,使程序在等待异步操作完成时不会阻塞线程,从而提高系统的响应能力。频繁的垃圾回收会导致程序暂停,影响实时性。在 C# 系统编程中,提高系统实时性可以从多个方面入手,下面将详细介绍不同的优化方向及对应的实现方法。对于对实时性要求较高的任务,可以适当提高其所在线程的优先级,让操作系统优先调度该线程。
2025-02-17 13:59:21
371
原创 C# 中,垃圾回收(Garbage Collection,简称 GC)机制
在 C# 中,垃圾回收(Garbage Collection,简称 GC)机制是自动内存管理的核心,它负责自动回收不再使用的对象所占用的内存,减轻了开发者手动管理内存的负担,避免了常见的内存泄漏问题。在Dispose方法中,调用了Dispose(true)来释放托管和非托管资源,并调用GC.SuppressFinalize(this)告诉垃圾回收器不再调用析构函数。对于非托管资源,需要手动释放。在Main方法中,使用using语句来确保资源在使用完毕后自动释放。// 析构函数,用于释放非托管资源。
2025-02-17 13:52:00
652
原创 多线程LOCK被占用如何让其他线程不等待?
concurrentDict.TryAdd(taskId, $“Value {taskId}”) 尝试向 ConcurrentDictionary 中添加元素,若添加成功则返回 true,若键已存在则返回 false,不会让线程等待。对于一些常见的共享数据结构操作,如字典的读写操作,可以使用 ConcurrentDictionary 等并发集合,它们内部实现了线程安全机制,不需要手动加锁,并且在操作冲突时不会让线程进入等待状态。如果未能获取写锁,执行 else 块中的代码,表明该线程不会等待。
2025-02-14 19:57:20
944
原创 Excel、CSV 和 YAML 三种格式的数据操作效率对比总结
其次,Python 语言当中直接内置了 CSV 的模块,它的使用方式和 open.函数非常的相似,几乎没有额外的学习成本。一、如果你只想对少量的用例进行测试,或者对测试数据的格式要较高的要求,用 YAML 存储用例数据会更利于解析,但是这种场景下一般可以直接使用 postman 这些成熟的工具,没有必要自己实现。在少量数据的解析上,YAML 会非常的方便。在一个项目当中,1000 个测试用例应该是比较合理的,所以在正常的测试场景下,使用 Excel 管理用例数据在读取效率上是合适的。
2024-08-06 10:53:52
1024
原创 什么是依赖属性,它和以前的属性有什么不同?为什么在WPF会使用它?
在WPF中,依赖属性(Dependency Property)是一种特殊类型的属性,用于在UI元素中存储和管理属性值。属性元数据:依赖属性具有属性元数据,用于定义属性的行为和特性。•值继承和优先级:依赖属性支持值的继承和优先级,使得属性的值可以从父元素传递给子元素,并根据不同的优先级进行覆盖。•数据绑定和样式:依赖属性天生支持数据绑定和样式,使开发人员可以轻松地实现动态更新和样式化的UI元素。•属性更改通知:依赖属性提供属性更改通知,使开发人员可以在属性值发生变化时做出相应的响应。
2024-05-21 10:39:03
569
原创 WPF中什么是模板
WPF中的模板是一种用于定义控件外观的机制。它可以使用XAML或代码来定义。在XAML中,模板可以定义在Template元素中。Template元素包含一个TargetType属性,用于指定模板适用的控件类型。Template元素还包含一个Content属性,用于指定模板的内容。将代码应用到button。
2024-05-21 10:30:31
179
原创 WPF中的ResourceDictionary
WPF中的ResourceDictionary是一种用于存储资源的容器。资源可以是任何类型的值,例如字符串、颜色、图像、样式等。ResourceDictionary可以用于将资源重用到多个位置,从而提高应用程序的可维护性和一致性。以上代码定义了一个ResourceDictionary,其中包含一个字符串资源和一个颜色资源。欢迎加入DOTNET开发跳槽。
2024-05-21 10:27:33
639
原创 【无标题】WPF路由事件的哪三种方式/策略(冒泡 直接 隧道)
当一个元素触发一个直接路由事件时,该事件会沿着元素树向上或向下进行传播,直到找到一个处理该事件的元素。处理直接路由事件的元素可以是触发事件的元素本身,也可以是其父级或子级元素。隧道路由事件(Tunneling Routed Events):隧道路由事件从根元素开始,沿着元素树向下传播,直到触发事件的元素。冒泡路由事件(Bubbling Routed Events):冒泡路由事件从触发事件的元素开始,沿着元素树向上传播,直到根元素。处理冒泡路由事件的元素通常是触发事件的元素本身或其父级元素。
2024-05-20 21:51:29
455
原创 解释完整的WPF对象层次结构
DispatcherObject 类的下一个子类是 DependencyObject 类。Object 类的下一个子类是 DispatcherObject 类。UIElement 类的下一个子类是 FrameworkElement 类。FrameworkElement 类是所有框架元素的基类。DependencyObject 类的下一个子类是 UIElement 类。UIElement 类是所有可视元素的基类。FrameworkElement 类的下一个子类是 Control 类。
2024-05-20 21:49:27
351
原创 【无标题】
概述:克服WPF界面操作中的卡顿问题,本文介绍了三种实用方法:异步操作、后台线程、以及BackgroundWorker,助您提升应用响应性,确保用户体验流畅。选择适合项目的方案,轻松解决耗时操作导致的界面卡死等待情况!异步操作通常是最为灵活和强大的解决方案,但在一些情况下,使用后台线程或BackgroundWorker可能更为简单和直观。创建BackgroundWorker实例,处理耗时操作。使用Thread创建后台线程执行耗时操作。// 更新UI或执行其他UI相关操作。// UI线程不被阻塞。
2024-05-20 21:42:19
277
原创 「桌面」(C#)WinForm程序缩小到右下角通知区域
首先点击窗口右上角“X”时,先让程序不要关闭:添加主窗体的 FormClosing 方法。即点击窗体右上角的“X”时要执行的操作,这里首先取消程序的“结束”命令。
2023-10-24 10:33:50
1617
原创 C# 连接Oracle数据库三种方法
由于微软在.net framework4中会将System.Data.OracleClient.dll deprecated,而且就访问效率和速度而言,System.Data.OracleClient.dll与Oracle.DataAccess.dll相比,微软的确实没有oracle提供的类库有优势,所以我放弃了使用多年的System.Data.OracleClient.dll,取而代之的是odp.net。2.不需要配置TnsNames.Ora文件。其他的都不用动,即可。2.可以直接添加引用。
2023-10-23 16:07:22
2429
转载 【无标题】
WPF MvvMLight一、MVVM概述MVVM是Model-View-ViewModel的简写,主要目的是为了解耦视图(View)和模型(Model)。MVVM结构如下:相对于之前把逻辑结构写在Code Behind 的方式,MVVM模式几乎完全解耦了视图和逻辑业务的关系,通过数据绑定和命令绑定来处理UI属性及事件驱动;同时,ViewModel中对属性的变更也会通知到View前端,让View前端实时更新。二、MVVMLight概述MVVMLight是一个实现MVVM模式的轻量级框架(相对于Pris
2023-10-23 15:18:14
118
原创 C# 两个独立exe程序直接通信
/注意,这里的长度是按字节来算的。Handle,再通过DLL库中的SendMessage函数发送消息给接收端,这样就完成了程序的直接通信。成一个文件,包含要发送的消息,接收端从这个目录中读取文件且获取消息。而且还有好几种方法。总的来说,这种方法的原理就是,利用FindWindow函数通过窗体标题查找出对方的进程,然后取得窗口。//将文本框中的值, 发送给接收端。
2023-06-09 15:54:20
495
原创 C#中Serializable序列化
一个不错的办法是,在类未封装的情况下,将构造函数标记为 protect。切记要在反序列化构造函数中调用基类,否则,将永远不会调用基类上的构造函数,并且在反序列化后也无法构建完整的对象。在反序列化过程中检索关键字/值对非常容易,但是,由于无法保证从散列表派生出的类已反序列化,所以把这些对象添加回散列表时会出现一些问题。如果从实现了 ISerializable 的类派生出一个新的类,则只要新的类中含有任何需要序列化的变量,就必须同时实现构造函数以及 GetObjectData 方法。C# 代码 复制。
2023-06-09 15:51:41
2879
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人