jn10010537
2024年,C#/C++
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【CSharp】Task.Run 将同步方法包装成异步方法
例如,你可能需要指定一个自定义的任务调度器,或者需要设置特定的任务选项,如 TaskCreationOptions.LongRunning(提示线程池创建一个新的线程而不是使用线程池中的线程)。Task.Factory.StartNew:可以通过 TaskCreationOptions.LongRunning 来优化长时间运行的任务,该选项提示任务调度器可能需要额外的线程资源,而不是使用线程池中的现有线程。可以使用 Task.Run 或者 Task.Factory.StartNew 来运行同步方法。原创 2024-08-09 12:22:01 · 240 阅读 · 0 评论 -
【CSharp】简单定义一个异步方法
2.方法的返回类型通常是 Task 或 Task,其中 T 是返回的类型。,Task 是 C# 中用于处理异步操作的核心类型,它属于 System.Threading.Tasks 命名空间。如果异步操作有返回结果,则为Task: 返回结果的异步操作,TResult 是操作完成时返回的类型。定义: 异步方法允许任务在不阻塞/占用线程的情况下进行,即它可以让程序在等待任务完成时执行其他操作。3.适用于简单场景:如果任务是非常快或是必须按顺序完成的,使用同步方法是合理的。原创 2024-08-09 10:24:41 · 313 阅读 · 0 评论 -
【CSharp】使用异步事件处理程序和委托来进行异步调用
本博客,示例调用异步事件处理程序,主线程调用异步方法后,并不会等待异步方法执行结束。同步调用可能会导致GUI主线程显示阻塞,在窗体程序中应尽量避免同步调用。可以看到主线程调用异步方法后,主线程不用等待方法结束再继续执行。以下代码异步调用方法,无需等待方法执行完成。异步调用,在GUI前后端交互的程序中很重要!异步调用在GUI交互中非常重要。原创 2024-08-03 22:55:02 · 262 阅读 · 0 评论 -
【CSharp】ushort类型的一维数组保存raw文件
ushort[]数据到RAW文件,只需要直接将数据写入raw文件即可。会使用到System.IO.File.WriteAllBytes。以下代码示例,创建一个ushort数组并保存到本地磁盘。原创 2024-07-25 09:08:08 · 193 阅读 · 0 评论 -
【CSharp】VisualStudio2019进行Windows窗体编程时关于AnyCPU的说明
如果在32位操作系统上运行,或者在64位操作系统上并且没有设置prefer 32-bit选项,应用程序将以32位模式运行。VS2019的选项AnyCPU,优势在于它提供了更多的灵活性,它适用于需要在不同平台上运行的通用应用程序,比如x86。如果在64位操作系统上运行,并且设置了prefer 32-bit选项为false,应用程序将以64位模式运行。AnyCPU是一个平台目标选项,它决定了编译后的应用程序将如何在不同的CPU架构上运行。由于我的项目引用的dll是x64bit,所以我这里目标平台,选择x64;原创 2024-07-23 11:36:55 · 421 阅读 · 0 评论 -
【CSharp】使用enum枚举编程的优点
枚举成员的基础类型默认为int,但枚举成员的值不仅限于int。可读性是针对阅读源码的开发者而言,枚举使代码更容易理解,枚举成员(如Enm_Off和Enm_On)具有更明确的含义。它避免了魔法数字,所谓魔法数字,就是上来光秃秃的定义个数字,比如使用魔法数字(如0和1)。但是需要注意:定义枚举时,你可以选择基础类型,但必须为所有枚举成员使用相同的基础类型。枚举定义了一组明确的、有限的值,可以用于表示特定的状态或选项,有助于避免无效状态。这里安全指的是类型安全,枚举提供了类型检查,防止无效的值被赋给枚举变量。原创 2024-07-04 00:52:40 · 431 阅读 · 0 评论 -
【CSharp】获得结构体内字段占用的内存大小
但是,对于复杂类型(如嵌套结构体、引用类型等),返回的大小可能并不是其实际的内存占用情况。博主以为最大的区别:struct结构体是值类型,而class类是引用类型。换句话说,只要结构体内部只要是相同的,就可以认为两个struct结构体相等,但是class类完全没这个概念。在 C# 中,IntPtr 是一个平台相关的整数类型,即是一个值类型,而不是引用类型。总之,您可以简单理解为简单的数据结构struct实现,复杂的class类去实现。可以理解成class类是struct结构体的升级版。原创 2024-07-03 23:31:12 · 556 阅读 · 0 评论 -
【CSharp】在class中申明public const int常量的应用
2.避免不规范的使用数字,程序开发者直接使用数字在程序中,这样会使代码难以理解和维护。使用常量可以提高代码的可读性和可维护性。1.在定义定义固定值的场景,例如状态码、事件类型、配置参数等。5.提高性能,常量在编译时就已确定,运行时直接使用,不需要在内存中创建对象,节省内存和运行时的开销。常量本身是静态的,即常量属于class本身与其实例化对象无关,且常量不可更改。3.通过常量的命令提高可读性,让代码更加直观,明确表达变量的意义。4.方便修改维护,常量只需修改常量的定义处修改。原创 2024-07-03 12:04:02 · 167 阅读 · 0 评论 -
【CSharp】定义结构体并指定字段对齐
这样的对齐方式最节省内存,但可能会导致性能问题,因为某些处理器对未对齐的数据访问速度较慢。不同的对齐方式会影响结构体的内存布局和大小。性能影响:1 字节对齐:可能降低性能,因为某些处理器对未对齐的数据访问速度较慢。在 C# 中,内存对齐是指数据在内存中的排列方式,使用StructLayout 特性用于控制结构体的内存布局。默认对齐的结构体的大小可能是 12 字节,因为编译器会插入填充字节,以使字段对齐到合适的边界。1 字节对齐:适用于需要节省内存且不要求高性能的场景,或与非托管代码交互时需要精确内存布局。原创 2024-07-02 22:26:09 · 321 阅读 · 0 评论 -
【CSharp】本地磁盘二进制文件写入以及读取
二进制文件存储效率高,适用于需要高效存储和处理的大量复杂数据的场景。为文件提供 Stream流,既支持同步读写操作,也支持异步读写操作。以下是写入数据到二进制文件,并从二进制文件中读取数据。文本文件易于阅读和调试,适用于简单数据存储;涉及类:FileStream 类。命名空间: System.IO。原创 2024-05-30 22:38:40 · 266 阅读 · 1 评论 -
【CSharp】在本地磁盘上创建文本文件并读取
File.CreateText(String) 方法:创建或打开用于写入 UTF-8 编码文本的文件。文本文件以可读的字符序列形式存储数据。常见的二进制文件包括 .exe、.dll、.jpg、.mp3、.bin 、.docx、.xlsx、.pptx等。常见的文本文件包括 .txt、.csv、.xml、.json、.cs、.c、.cpp、.py 等。File.OpenText(String) 方法:打开现有 UTF-8 编码文本文件以进行读取。数据可以是任何格式,如整数、浮点数、图像数据、音频数据等。原创 2024-05-30 21:59:49 · 204 阅读 · 0 评论 -
【CSharp】将文件夹及其文件拷贝至新的目录
程序逻辑是每次找到当前文件夹下的文件的文件夹,递归拷贝文件,直到文件夹下只有文件将结束递归下去。Directory.GetDirectories方法:返回满足指定条件的子目录的名称。Directory.GetFiles方法:返回满足指定条件的文件的名称。需要考虑文件夹下包含多层文件夹的情况,即我们需要递归的拷贝目录!文件夹以及文件夹下的文件拷贝至新的目录是一种非常常见的操作。Path.Combine方法:将多个字符串组合成一个路径。File.Copy方法:将现有文件复制到新文件。原创 2024-05-30 00:15:09 · 216 阅读 · 0 评论 -
【CSharp】判断目录以及文件是否存在
如果该目录不存在或者在尝试确定指定目录是否存在时出错,则为 false。具体:如果调用方具有要求的权限并且包含现有文件的名称,则为 true;我们在进行磁盘IO的时候进行需要判断目录、文件是否存在,根据判断结果再做进一步的操作。其中判断目录是否存在,涉及Directory.Exists(String) 方法;其中判断文件是否存在,涉及File.Exists(String) 方法;以下示例判断目录是否存在,如果不存在则递归的创建目录。判断目录存在并没有文件的情况下创建文件。命名空间:System.IO。原创 2024-05-29 22:49:44 · 484 阅读 · 0 评论 -
【CSharp】ushort* 类型的指针操作ushort变量以及数组
在 C# 中,ushort[]* 这种语法是不允许的,因为 C# 不支持直接定义指向数组类型(如 ushort[])的指针。即ushort* 既可以标志一个ushort值的地址也可以表示ushort[]数组的地址(数组名称即数组首个元素的地址)C# 的指针类型只能指向具体的值类型(如 ushort, int, float 等),而不能指向数组类型或引用类型。如果你想要操作数组的指针,你需要获取数组第一个元素的指针,并通过指针进行数组的操作数组。原创 2024-05-28 23:57:20 · 559 阅读 · 0 评论 -
【CSharp】Char[]与ushort[]相互转换
没有其他类型到char类型的隐式转换,由于ushort和char的数值范围都是从0 到 65,535。本博客实现char[] 转化为ushort[] ,以及ushort[]转换为char[]char类型的可能值对应于统一字符编码标准(Unicode)的字符集。char 类型是 16 位 Unicode 字符,数据范围也是。char:代表无符号的16位整数,数值范围从0~65535。注意:2的16次方-1 = 65535。原创 2024-05-28 23:26:26 · 316 阅读 · 0 评论 -
【CSharp】ushort[]的IntPtr快速转换为ushort[]无符号短整型数组
本博客通过Marshal.Copy以及Buffer.BlockCopy实现快速的数组拷贝和转化无符号短整型数组ushort[]关于Buffer.BlockCopy方法:将指定数目的字节从起始于特定偏移量的源数组复制到起始于特定偏移量的目标数组。关于Marshal.Copy 方法:将数据从托管数组复制到非托管内存指针,或从非托管内存指针复制到托管数组。探测器/相机SDK获得是InPtr指针,它指向ushort[]无符号短整型数组的内存地址.length Int32 : 要复制的数组元素的数目。原创 2024-05-28 22:40:41 · 383 阅读 · 0 评论 -
【CSharp】无符号短整型数组ushort[]转化为IntPtr
这里就设计相机传感器上的AD转换器(模拟信号->数字信号)的bit数,我手里探测器的AD转化器是16bit的即灰阶范围是65536个层次(0~65535),因为长度16位的bit最大可以表示65535;我们的相机或者探测器是一个感光的传感器,一般将光波打到闪烁体上,闪烁体发光后进行光电转换得到电信号,您可以这么简单的去理解。通过SDK获得探测器获得raw原始数据,C#通过api得到是IntPtr指针,它指向ushort[]无符号短整型数组。原创 2024-05-28 21:38:44 · 517 阅读 · 0 评论 -
【CSharp】int类型与IntPtr类型之间的转换
例如, 的 IntPtr 实例在 类中 System.IO.FileStream 广泛使用,用于保存文件句柄。也就是说,此类型的实例应在 32 位进程中为 32 位,在 64 位进程中为 64 位。从而消除了在设置其元素值之前使用 Marshal.Copy) 复制到单独托管数组 (整个非托管数组的开销。从而消除了在读取其元素值之前使用 Marshal.Copy) 复制到单独托管数组 (整个非托管数组的开销。支持 IntPtr 指针的语言可以使用 类型,并作为在支持和不支持指针的语言之间引用数据的常用方法。原创 2024-05-28 21:15:18 · 985 阅读 · 0 评论 -
【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片
System.Drawing.Common 是一个用于图像处理和图形操作的库,它是 System.Drawing 命名空间的一部分。由于 .NET Core 和 .NET 5+ 的跨平台特性,许多以前内置于 .NET Framework 中的库被移到了独立的NuGet包中,以便更好地管理和跨平台使用。本博客采用的替代解决方案是使用BitMiracle.LibTiff.NET库,这是一个强大的库,专门用于处理TIFF图像格式。通过 NuGet 包管理器安装:System.Drawing.Common。原创 2024-05-27 23:00:36 · 629 阅读 · 0 评论 -
【CSharp】将ushort数组保存为3通道位深24bit的Tiff图片
这里就设计相机传感器上的AD转换器(模拟信号->数字信号)的bit数,我手里探测器的AD转化器是16bit的即灰阶范围是65536个层次(0~65535),因为长度16位的bit最大可以表示65535;3.关于数据转化:将 ushort 数组的数据转换为 byte 数组,并缩放到8位(每个像素的高8位)。2.写入数据之前先锁定位图的内存区域:使用 LockBits 方法锁定位图的内存区域,以便写入数据。ushort:代表有符号的16位整数,范围从0 到 65,535(2的16次方-1)原创 2024-05-27 20:30:30 · 510 阅读 · 0 评论 -
【CSharp】Windows应用窗体程序设置图标
在C#的Windows应用窗体中,你可以为你的应用程序设置图标。原创 2024-03-13 12:17:51 · 705 阅读 · 0 评论 -
【CSharp】windows窗体应用关闭后进程未关闭以及串口资源被占用的解决办法
我的项目是 Windows窗体应用( .NET Framework)。开发的上位机程序在关闭窗体右上角的X后,发现在任务管理器中仍然可以查到该程序进程,同时之前未关闭的串口号资源被占用。我的程序架构是UI主线程负责显示,控制开关会启动后端子线程。原创 2024-03-13 08:19:13 · 885 阅读 · 0 评论 -
【CSharp】文件“bin\Debug\xxx.exe”正由另一进程使用,因此该进程无法访问此文件的解决办法
出现以上问题的原因就是运行windows窗体应用后,直接关闭窗体时没有关闭监听和线程,导致第二次运行时无法打开服务器。我的项目是 Windows窗体应用( .NET Framework)。开发的IDE是Microsoft Visual Studio 2019。建议的方法是打开任务管理器,关闭对应的任务。简单粗暴的方法,关机重启。原创 2024-03-06 12:16:27 · 877 阅读 · 0 评论 -
【CSharp】线程间操作无效,从不是创建控件XXX的线程访问它的解决办法
在 C# 中,窗体(Windows Form)的 UI 元素通常在创建它们的主线程上进行访问和操作。如果不是,它使用 Invoke 方法在正确的线程上执行相应的操作,确保对 UI 控件的安全访问。请注意,使用 Invoke 可能会导致性能影响,因此最好在需要时才使用,而不是在整个应用程序中频繁调用。分析原因是你在一个线程中尝试访问或修改了另一个线程创建的控件,而在多线程应用程序中,直接访问 UI 元素可能导致问题。在 C# 中,UI 元素通常在创建它们的主线程上进行访问和操作。原创 2024-03-05 08:38:24 · 859 阅读 · 0 评论 -
【CSharp】关于xxx.csproj文件的理解
Visual Studio会根据csproj里的内容来定义来管理项目文件以及相关其他一些种类非常丰富的数据及操作。.csproj文件记录了与工程有关的相关信息,例如包含的文件,程序的版本,所生成的文件的类型和位置信息等。在.NET框架的开发环境中建立项目时,会产生.csproj文件,这是C#的项目工程文件。csproj的全称是C Sharp Project的缩写,是C#项目文件的扩展名。上面的iRayBase.csproj 文件后缀是 .csproj。在示例代码里,遇到.csproj 文件。原创 2023-07-21 21:10:44 · 1142 阅读 · 0 评论