C#
重-庆-教-主
这个作者很懒,什么都没留下…
展开
-
C#+WPF上位机开发(模块化+反应式)作者:重庆教主
程序员往往会将一个大型的软件项目拆分成小项目(模块),比如上位机系统中会接入各种硬件(工业相机、PLC、数据采集器、扫码枪、控制卡等),良好的软件架构思路是将同一种类型的硬件抽象成一个硬件抽象类,然后,不同型号的硬件与继承这个抽象基类,实现各自硬件的业务逻辑(加载硬件、打开硬件、使用硬件、关闭硬件),要实现这些开发,Prism的模块就派上用场了。第三,是数据库模块。第二、是硬件模块,上位机开发离不开硬件的接入,而不同的上位机系统,其接入的硬件也是五花入门,比如MES系统,可能最常见的硬件是PLC、扫码枪;原创 2023-08-01 11:48:49 · 4536 阅读 · 0 评论 -
C#Task线程并发简单示例
最近项目中遇到一个应用场景,即需要调用同一个函数256次(函数执行时长20毫秒,耗时总长为20*256毫秒,即5.12秒),每次传入的参数略有不同,最后根据返回结果从中选择正确的那一次调用结果,最初采用一个for循环,每次都从0开始至255结束,后来想到可以用并发思路,一次性生成256个Task,这样耗时相当于一个Task的时长,从5120毫秒的总耗时下降到20毫秒,大大提高了软件的执行效率。下面用一个示例来说明,整个过程只需要三步,分别是:第一步,首先我们创建两个类,分别代表传入的参数和返回的结果。原创 2023-04-18 09:47:59 · 683 阅读 · 1 评论 -
利用泛型的C#中的深拷贝
【代码】利用泛型的C#中的深拷贝。原创 2023-02-27 09:20:20 · 255 阅读 · 0 评论 -
关于C#中的指针拷贝
1、RtlCopyMemory与RtlMoveMemory这两个函数是内核函数api,对应Win32 API是CopyMemory和MoveMemory。都能实现内存块的复制,两者的区别在于CopyMemory是非重叠内存区域的复制,MoveMemory可以不考虑是否重叠,都可以安全复制。2、Marshal类Marshal.copy()方法用来在托管对象(数组)和非托管对象(IntPtr)之间进行内容的复制。但是它只能实现数组拷贝原创 2022-12-05 11:01:27 · 2503 阅读 · 0 评论 -
Bitmap保存图片到指定目录
Bitmap类保存图片到本地原创 2022-08-25 09:11:48 · 787 阅读 · 0 评论 -
Bitmap保存图片到指定目录
Bitmap类保存图片到本地原创 2022-06-28 09:49:17 · 740 阅读 · 0 评论 -
如何求100万长度的数组的中间值元素,采用定向数组只需6个毫秒的算法
最近有一个项目上的需求,在一个无序的数组中找到最中间值的那个元素,关键是数组的长度很长, 经过测试,如果采用传统的冒泡排序算法,100万数组需要耗时几万毫秒,后采用下面的定向组数算法,不去排序,而是记录每个元素出现的次数,最后找到中间值,这样下来,100数组需要的耗时为6毫秒,效率提高了几万倍!...原创 2022-06-09 11:03:50 · 250 阅读 · 0 评论 -
一个比较稳定的PLC通讯模块设计
这个架构是经过几个项目的验证后,综合修改而来,可满足大部分情况下的使用。分为两层,即两个项目,下层只是实现最基本的串口或网口通讯业务,上层包含了一个项目中的部分业务,是随着业务需要有一定修改的。...原创 2022-04-11 15:46:16 · 876 阅读 · 3 评论 -
C#中XmlSerializer类读取xml文件内容并映射到实体类
开发软件的过程中,我们需要一些系统设置参数,通常会设计一个全局类来保存,其中每个属性代表一个参数,那么怎么样将这个参数从XML文件中读出来,并保存到对应的属性中呢,可以利用XmlSerializer的反序列化达到这一目的。第一步,创建一个XML文件,其内容如下:注意XML文件的根名:ComfigModel第二步,创建两个实体类,与这个XML文件内容进行映射第三步,设计一个帮助类XmlSerializerHelper,这里我们用了两种方式将XML内容读出来并映射到ConfigModel类中,这个原创 2022-03-31 15:15:11 · 1825 阅读 · 2 评论 -
AutoMapper的简单用法
第一步 ,下载组件(我选择的是8.1.1)第二步 ,创建一个文件夹AutoMapper,这样我们把所有文件放在这里第三步,创建一个Configration类,用来配置Mapper在这里用到了MapperConfiguration类,并添加了两个Profile文件,通常把一个model转换成另一个model的映射都写成一个Profile文件,并添加到mapperconfiguration中,最后利用createmapper实例化Mapper,方便我们将来使用。接下来看看两个Profile文件是怎原创 2022-03-30 18:01:34 · 7907 阅读 · 0 评论 -
Task线程管理:重启线程及CancellationToken用法
需求分析:假定有3个线程,有一个PLC下位机,当连接成功时,开启3个线程干活,如果连接不成功,则重新开启3个线程。当3个线程开启成功并工作一段时间后 ,利用CancellationToken退出线程 。设计如下 :首先设计一个类TaskModel,用来封装线程名字,任务,实际执行的委托及取消令牌,然后实例化三个TaskModel,并放入一个队列,最后开一个轮询线程,看看队列中的线程状态,如果没有running 就重新开启新的线程,主要利用Task的IsCanceled 、IsFaulted 和IsComp原创 2022-02-21 14:44:08 · 2546 阅读 · 1 评论 -
C#中利用Mutex实现程序只能运行一个实例的功能
在Main()入口中,我们用下面的代码实现当前程序只能被打开一个实例using (System.Threading.Mutex run = new System.Threading.Mutex(true, "app", out bool runone)) { if (runone) { run.ReleaseMutex(); MainFrm frmMain = new MainFrm(); Application.Ru原创 2022-02-18 09:16:54 · 621 阅读 · 0 评论 -
C#中获取项目的程序集版本号
如图所示,要获取图中的版本号代码如下var Version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();原创 2022-02-18 09:05:09 · 1190 阅读 · 0 评论 -
关于Task同步或异步操作的常用示例用法
Task有一个 wait()方法,用来暂时当前调用线程,并等待某个子线程执行结束后,继续执行调用者剩下的代码。button.Content = $"测试...";int number = 0;Task t = new Task(() =>{ for (int i = 0; i < 3; i++) { Thread.Sleep(1000); number += DateTime.Now.Second; Application.原创 2022-01-21 17:20:23 · 1317 阅读 · 6 评论 -
JsonHelper
public class JsonHelper { /// <summary> /// 将对象序列化为JSON格式 /// </summary> /// <param name="o">对象</param> /// <returns>json字符串</returns> public static string SerializeOb.原创 2022-01-03 11:37:16 · 1025 阅读 · 0 评论 -
C#中对字符串的反序实现
这两天遇到一个HR提了一个问题,要求将一个字符串实现反序操作,但是又不能将里面的数字反序,现在将用两种方法实现。例如:输入:ABC456输出:456CBA输入:123ABC输出:CBA123输入:ABC456XYZ789输出:789ZYX456CBA/// <summary> /// 反转字符而不反转数字 /// by 佘中六 /// date 2022/01/01 /// </summary> public class Ca原创 2022-01-03 09:25:14 · 1477 阅读 · 0 评论 -
C#中解决加载图片被占用的问题
public static System.Windows.Media.Imaging.BitmapImage GetBitmapImage(string fileName){ if (File.Exists(fileName) == false) return null; FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read); var image = Image.FromS原创 2021-12-01 09:28:10 · 2402 阅读 · 0 评论 -
关于File.ReadAllBytes读取大图失败的问题
公司项目中要读取bmp图片进行扣图和优化处理,之前是16001200像素,三通道,读出来的byte数组大小为160012003+54=5760054个字节,后来换了大图,像素为25921944*3+54=15116598个字节,但是如果用File.ReadAllBytes()函数读的话,读出来只有三百多万个字节,显示是不对的,怎么办呢?后来想到可以用System.Drawing.Bitmap去读图,因为这个类是专门读bmp格式的,然后再利用MemoryStream类换成字节,这样就达到了读大图的效果。Sy原创 2021-11-17 09:51:38 · 1159 阅读 · 0 评论 -
C#中的浅表副本Clone与深拷贝Clone
[Serializable] public class Person { public string Name { get; set; } public int Age { get; set; } public List<Person> Persons { get; set; } = new List<Person>(); //浅Clone public Person Clone()原创 2021-11-12 17:27:35 · 634 阅读 · 0 评论 -
关于C#引用C++库如何做数据封送的问题
最近公司C#项目要引用C++库,需要传递一个结构体,C++要求如下:struct CapInfoStruct {unsigned char *Buffer;unsigned long Height;unsigned long Width;unsigned long HorizontalOffset;unsigned long VerticalOffset;unsigned long Exposure;unsigned char Gain[3];unsigned char Control;原创 2021-11-12 11:25:40 · 589 阅读 · 0 评论 -
利用泛型生成类的实例或单例的工厂
public static class Provider<T> where T : class, new() { /// <summary> /// 新实例 /// </summary> /// <returns></returns> public static T Factory() { return new T();.原创 2021-10-20 15:32:01 · 159 阅读 · 0 评论 -
道格拉斯数据压缩算法
/// <summary> /// 道格拉斯数据压缩算法 /// 2021.10.12 /// </summary> public class Douglaser { /// <summary> /// 数组长度 /// </summary> private int sourceLenght = 0; /// <summary>.原创 2021-10-13 18:01:58 · 496 阅读 · 0 评论 -
C#特性之CallerMemberName、CallerFilePath和CallerLineNumber
/// <summary>/// Writes an error level logging message./// </summary>/// <param name="message">The message to be written.</param>public void WriteError(object message,[CallerMemberName] string memberName = "",[CallerFilePath]转载 2021-06-04 16:57:16 · 499 阅读 · 0 评论 -
AutoResetEvent和Queue在线程用的使用
//类型简介AutoResetEventWindow 类:UI窗体Port类:一个模拟串口的类型Sender类:数据包//成员简介Port.ReceiveEvent:一个事件成员,模拟串口收到数据后通过事件触发一个回调Port.Write():一个模拟串口写入数据的方法程序运行思路1、在UI窗体类中声明一个队列queue,用于存储下包数据包Sender的实例2、在UI窗体类中声明一个producer线程,用于不断向队列queue中新增sender3、在UI窗体类中声明一个customer原创 2021-06-02 13:28:41 · 205 阅读 · 0 评论 -
C#多线程启动时传入参数
第一步,创建一个带参数线程方法static void ThreadMethod(string str){ MessageBox.Show(str);} 第二步,创建并启动线程string str = "Hello,World!";Thread thread = new Thread(() => ThreadMethod(str));thread.Start(); ...原创 2021-05-18 10:12:00 · 257 阅读 · 0 评论 -
C#中单例模式最简单用法之Lazy
例如下面这个类要实现单例模式,只需要增加一个Lazy并返回AppData的实例即可。public class AppData{ public static AppData Instance = new Lazy<AppData>(() => new AppData()).Value; public AppData(){} public void Method(){} }怎么使用呢,如下获取单例var instance = AppData.Instance;原创 2021-05-14 15:09:46 · 1171 阅读 · 0 评论 -
MvvMLight中Messager的用法
MvvMLight中的Messager就是两个类之者进行通信的助手,不管这两个类的类别是某个自定义控件、某个窗体类或者ViewModel类。用法是分为三步:第一步注册Messager,第二步发送消息,第三步接收消息。//注册的时候,会顺带传入一个方法,该方法用来处理接收到的消息//通常在构造函数中注册Messenger.Default.Register<string>(this, "暗号", MethodName);//这个方法表示将收到的消息进行逻辑处理private原创 2021-05-14 14:16:04 · 651 阅读 · 2 评论 -
WPF中关于DataTemplate的示例(深入浅出WPF)
第一上,UI代码<Window x:Class="WpfApp1.ImageWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"原创 2021-05-11 16:00:15 · 268 阅读 · 0 评论 -
EF中实体字段对应数据库字段使用Column或NotMapped不对应
private int carId = 0; /// <summary> /// CarID /// </summary> [Column("CarID")] public int CarID { get { return carId; } set { carId = value; .原创 2021-04-18 13:33:35 · 677 阅读 · 0 评论 -
C#中App.Config自定义节点的读写
第一步,在app.config中增加节点集合 <appSettings> <add key="House1" value="COM3"/> <add key="House2" value="COM4"/> <add key="House3" value="COM5"/> <add key="House4" value="COM6"/> <add key="House5" value="COM7"/&g原创 2021-04-15 09:42:28 · 847 阅读 · 0 评论 -
利用IValueConverter接口转换器在XAML中转换参数值
第一步,新建一个转换器 public class CornerConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) return DependencyProperty.UnsetVa原创 2021-04-14 09:45:33 · 345 阅读 · 0 评论 -
字节数组转16进制字符串
/// <summary> /// 字节数组转16进制字符串 /// </summary> /// <param name="bytes"></param> /// <returns></returns> public static string ByteToHexStr(byte[] bytes) { strin..原创 2021-04-08 17:58:03 · 141 阅读 · 0 评论 -
WPF中设置Image控件的图片
image.Source = new BitmapImage(new Uri(“图片地址”, UriKind.RelativeOrAbsolute));原创 2021-03-31 15:32:34 · 1021 阅读 · 0 评论 -
C#当前漫游用户的应用程序特定数据的公共储存库的目录
string path = System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);原创 2021-03-30 14:16:14 · 161 阅读 · 0 评论