
C#
文章平均质量分 86
JimCarter
与专业人员为伍,guyiming2011@126.com
展开
-
【转】新版 C# 高效率编程指南
C# 从 7 版本开始一直到如今的 9 版本,加入了非常多的特性,其中不乏改善性能、增加程序健壮性和代码简洁性、可读性的改进,这里我整理一些使用新版 C# 的时候个人推荐的写法,可能不适用于所有的人,但是还是希望对你们有所帮助。注意:本指南适用于 .NET 5 或以上版本。在合适的时候使用 C# 的新特性,不但可以提升开发效率,同时还能兼顾代码质量和运行效率的提升。但是切忌滥用。新特性的引入对于我们写高质量的代码无疑有很大的帮助,但是如果不分时宜地使用,可能会带来反效果。转载 2024-07-11 10:26:17 · 344 阅读 · 0 评论 -
【C#】使用ffmpeg image2pipe将图片保存为mp4视频
在使用原生ffmpeg之前,笔者使用了几个第三方的nuget库,如:FFmpeg.AutoGen、Xabe.FFmpeg、Accord.Video.FFMPEG。前两个库要么只支持将文件夹里现有的图片保存为mp4,要么不支持设置每帧的PTS,导致生成的mp4播放速度太快。ffmpeg只是提供了一个exe,并没有官方的API可供我们调用,只提供了一大堆的参数说明,真是令人头大。最后,只能使用的原生的ffmpeg了。在正式开始之前,先介绍下我的需求是怎么样的,基于此需求如何使用ffmpeg实现。原创 2022-09-19 12:15:15 · 7117 阅读 · 13 评论 -
C# 编码规范
从业多年,不断发现有很多团队的代码写的很随意,各种风格、命名方式都有,有用c++风格的,有用java风格的。所以本人在这里介绍下微软官方的C#编码规范,规范本身内容其实不长,但是如果能过一遍,相信对以后自己的编码会有很大帮助。注:本文不是一定适用所有人和所有团队,供大家参考。默认的就是最好的。......原创 2022-08-18 22:07:25 · 3617 阅读 · 0 评论 -
【C#】RabbitMQ高阶指南(三)(完)
续上一篇文章:【C#】RabbitMQ进阶指南文章目录引言1. 存储机制1.1 队列的结构1.2 惰性队列(lazy queue)2. 内存和磁盘告警2.1 内存告警2.2 磁盘告警3. 流控3.1 流控原理4. 镜像队列引言本文将会在原理层面,进一步剖析并了解RabbitMQ的实现原理,可以帮助我们在实际工作中透过现象看到本质。比如一个队列的内部存储其实是由5个子队列来流转运作的,队列中的消息可以有4中不同的状态等,通过这些可以明白在使用RabbitMQ时尽量不要有过多的消息堆积,不然会影响整体性能原创 2022-03-20 17:05:06 · 3238 阅读 · 0 评论 -
【C#】RabbitMQ进阶指南(二)
文章目录1. 消息何去何从1.1 备选交换机(Alternate Exchange,AE)2. 过期时间设置(Time to Live, TTL)2.1 设置消息的过期时间2.1.1 通过队列设置2.1.2 单独设置某个消息的ttl2.2 设置队列的过期时间3.死信队列(Dead-Letter-Exchange,DLX)4. 延迟队列5. 优先级队列6. 持久化7. 生产者确认7.1 事务机制7.2 发送方确认机制7.2.1 发布一条消息就等待一次确认结果7.2.2 批量发布N条消息等待一次确认结果7.2.原创 2022-02-27 10:42:05 · 2899 阅读 · 0 评论 -
Serilog 2.10 中文文档
文章目录1. 快速开始2. 基本配置2.1 Sink2.2 输出模板2.3 日志等级2.3.1 日志等级判断2.3.2 动态日志等级2.4 不同级别的日志输出到不同的地方2.5 Enrichers2.6 根据Enricher的值进行过滤2.7 Sub-logger2.8 从配置文件读取配置3. 结构化数据4. 消息模板5. 自定义序列化json本文基于发稿时的最新版本,Serilog: 2.101. 快速开始这里以控制台应用为例,首先安装以下三个nuget包:SerilogSerilog.Sink原创 2021-11-26 18:08:41 · 5126 阅读 · 4 评论 -
【C#】RabbitMQ入门指南(一)
文章目录1.简介2. 相关概念2.1 消息中间件2.2 消息中间件的作用2.3 RabbitMQ中的一些概念2.4 RabbitMQ模型3. 点对点3.1 轮询消费3.2 手动发送ACK与数据持久存储4.发布订阅4.1 交换机(Exchange)4.2 `fanout`交换机4.3 路由(Routing)4.3.1 `Direct`交换机4.4 主题(Topics)4.4.1 `Topic`交换机4.4.2 最终实现5. 远程过程调用(RPC)6. 发布确认(Publisher Confirms)6.1 发原创 2021-07-17 17:14:30 · 10960 阅读 · 5 评论 -
【C#】winform安全的跨线程访问控件
很多winform开发的新人,在子线程(非UI线程,线程id不为1)要更新控件的text属性时经常会遇到不允许跨线程访问控件的异常:Cross-thread operation not valid. Control “” accessed from a thread other than the thread it was created on。那么在这篇文章里就总结下如何该正确的跨进程访问控件。如果你从一个不同的线程要访问控件(包括Form),则必须调用控件的这四个方法Invoke、BeginInvo原创 2021-02-05 18:18:29 · 4304 阅读 · 0 评论 -
【C#】解决使用async/await时,await之后的方法没有resume到之前线程执行
一般来说,await会捕获当前同步上下文SynchronizationContext.Current,如果同步上下文为null,则继续捕获TaskScheduler.Current。await之后的代码会恢复到捕获的上下文继续执行。但是如果你的异步操作执行的比较早,例如在Application.Run(new Form1())之前执行: static class Program { /// <summary> /// The main entry po原创 2020-12-30 16:26:36 · 871 阅读 · 0 评论 -
【C#】使用AutoMapper-看这篇就够了
1.基本配置Profile配置public class OrganizationProfile : Profile{ public OrganizationProfile() { CreateMap<Foo, FooDto>(); }}使用:var configuration = new MapperConfiguration(cfg => { //cfg.CreateMap<Foo, Bar>(); cfg.AddProfile<原创 2020-11-20 10:22:04 · 41810 阅读 · 1 评论 -
解决PostSharp Essentials限制最多50个class使用的问题
因为PostSharp其他版本一直都是收费的,所以项目里用的都是Essentials版本,功能都是一样的,只不过有些其它的限制。比如每个project里不能有超过10个class使用PostSharp,每个solution里不能超过50个class使用PostSharp。在之前这个限制倒没怎么影响到我,但随着项目越来越大,50个class已经不够用了。怎么办? 网上搜了下破解方法,有的干脆不能...原创 2020-08-26 12:42:39 · 3070 阅读 · 0 评论 -
【C#】ElasticSearch环境搭建与使用
以前在.net里如果要做全文搜索的话,一般都会使用Lucene.net配合盘古分词。使用起来麻烦而且还不容易查看数据,后来就出现了ElastiSearch。ES也是基于Lucene并采用java编写, 相当于对Lucene做了一层封装,我们只需要调用ES相关API即可,配合Kibana数据可视化工具可以很方便的分析和统计数据。## 1.安装这里以windows环境为例,linux类似。移步到ES官网,下载ElasticSearch和Kiba原创 2019-07-16 19:22:25 · 9427 阅读 · 4 评论 -
【C#】在.net framework的控制台程序中使用HttpClientFactory
一般来说我们发送Web请求的时候,都是通过HttpClient。但是使用的时候会有两个问题:因为HttpClient实现了IDisposable接口,每次使用如果都new一个对象的话,最后会耗尽你的主机端口。微软建议使用单例模式。如果使用单例模式的话,端口是节省了,但是请求地址的DNS如果改变了的话,这个单例并不知道。为了解决上面的两个问题,社区就出现了HttpClientFactory...原创 2019-02-25 19:15:14 · 7146 阅读 · 2 评论 -
【C#】winform自定义控件在工具箱中显示和属性在属性面板中显示
在开发自定义控件件时,有好些Design属性是要使用的,如ToolboxItem, ToolboxBitmap, Category, Description等等,不知道这些属性其实也可以将控件搞出来,不过,知道了,会令事件更加简单,令控件更加专业和实用。有时,不知道用法,会令到项目的其他同事好烦,因为这个控件是你提供的。下面对一些常用的Design属性做一个简单的生产介绍。ToolboxIte...转载 2019-02-12 17:35:07 · 12954 阅读 · 2 评论 -
【VisualStudio】常用快捷键
编辑.在文件中查找(全局搜索) Ctrl+Shift+F 视图.快速操作和重构(智能提示) Ctrl+. 格式化代码 Ctrl+K+D原创 2018-08-08 20:29:02 · 2015 阅读 · 2 评论 -
【C#】winform多语言方案
1.CultureInfo的获取和设置CultureInfo通常由两位小写的LanguageCode+两位大写的Country/RegionCode组成,如:zh-CN,zh-TW,jr-JP,en-US,zh-HK。部分地区由languageCode+sripttag+country/regioncode,如zh-Hans-HK(香港简体中文)。 几个有用的属性:CultureInf...原创 2018-06-04 14:25:11 · 14440 阅读 · 2 评论 -
【C#】使用ADO.NET/Dapper访问Sqlite数据库,SqliteHelper帮助类
这个就比较简单了,用过sqlserver的人都知道访问数据库的时候一般都会有个SqlHelper的帮助类,这里就依葫芦画瓢写了个SqliteHelper,很简单:using System;using System.Collections.Generic;using System.Data;using System.Data.SQLite;using System.IO;using...原创 2018-05-15 16:20:30 · 8540 阅读 · 1 评论 -
【C#】使用EF访问Sqlite数据库
1. 先上nuget下载对应的包 如图,搜索System.Data.SQLite下载安装即可,下载完之后带上依赖一共有这么几个:EntityFramework System.Data.SQLite System.Data.SQLite.Core System.Data.SQLite.EF6System.Data.SQLite.Linq安装完成后,会添加App.c...原创 2018-05-15 11:28:15 · 21820 阅读 · 3 评论 -
【VS】使用vs2017自带的诊断工具(Diagnostic Tools)诊断程序的内存问题
前言一般来说.NET程序员是不用担心内存分配释放问题的,因为有垃圾收集器(GC)会自动帮你处理。但是GC只能收集那些不再使用的内存(根据对象是否被其它活动的对象所引用)来确定。所以如果代码编写不当的话,仍然会出现内存泄漏的问题,常见的情况有:一个静态变量引用了一个应该被释放的对象,事件注册后不解除注册,非托管资源使用后没有手动释放。不断的内存泄漏终会引起内存不足,挂掉你的程序。对于这种内存原创 2018-01-08 16:02:37 · 40158 阅读 · 4 评论 -
【C#】获取任意文件的缩略图
因为用shell取缩略图时,对于损坏的文件,读出来的图有黑边,所以就诞生了以下方法,不过这个效率要比用shell取的低3-4倍。1.添加类WindowsThumbnailProvider[Flags] public enum ThumbnailOptions { None = 0x00, BiggerSizeOk = 0x01, InMem...原创 2017-09-20 16:47:11 · 5423 阅读 · 3 评论 -
【C#】WixToolset快速入门教程
介绍给windows系统做软件,常见的打包工具大家可能都听说过,如:大名鼎鼎的Installshield、Inno setup等。在遇见Wix之前InstallShield时我的主力打包工具,操作简单方便项目使用到的dll文件会自动添加,多语言支持也很好,不过不好的是免费版的功能就那几样,越来越无法满足自己的要求。后来就尝试了下Inno setup,这个是用脚本进行配置并生成安装包的,简单尝试之后发原创 2017-09-02 17:11:03 · 20758 阅读 · 0 评论 -
【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题
最近在debug鼠标位置捕获的功能时发现在其中的一台开发电脑上,SetWindowsHookEx一直返回0,导致Hook设置失败,有时候调成Release模式又是正常的。代码如下:hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure,Marshal.GetHINSTANCE(System.Reflection.Assem...原创 2017-08-30 11:27:47 · 8722 阅读 · 2 评论 -
【WPF】右下角弹出自定义通知样式(Notification)——简单教程
1.先看效果2.实现1.主界面是MainWindow上面就只摆放一个Button即可。在Button的点击事件中需要new一个弹出的NotificationWindow。代码如下: public static List<NotificationWindow> _dialogs = new List<NotificationWindow>(); int i = 0; private void Bu原创 2017-07-13 18:11:04 · 13272 阅读 · 9 评论 -
【C#】简单解决PathTooLong的Exception
前提windows系统路径的最大长度限制是260个字符(听说.Net 4.6.2,取消了这个限制),而Linux或者Unix系统的好像是4K个字符。所以如果一个文件夹由Linux系统创建,然后由windows系统读取处理的话,就会出现PathTooLong的异常。解决方法其实很简单在VS中添加如下Nuget包: 在用到的地方把系统的File和Directory替换为LongPathFile和Lon原创 2017-06-27 10:09:15 · 2504 阅读 · 1 评论 -
【C#】wpf自定义calendar日期选择控件的样式
首先上图看下样式原理总览ItemsControl内容的生成实现界面的实现后台ViewModel的实现首先上图,看下样式 原理1. 总览:Calendar本质上是一个6x7的列表,这个列表可以用ItesControl来实现。其填充的每一个item都是一个自定义样式的Button,Button外面是一个圆形的border。根据Button按钮的IsEnabled状态,设置foregroun原创 2017-06-19 18:09:42 · 9972 阅读 · 6 评论 -
【C#】wpf添加gif动图支持
1.nuget里下载WpfAnimatedGif包,然后安装。2.添加WpfAnimatedGif包的命名空间:xmlns:gif="http://wpfanimatedgif.codeplex.com"3.开始使用: 这段代码只是个示例,主要的就是把AnimatedSource设置为你的gif动画即可。总的代码:<Page x:Class="Omni.To原创 2017-06-08 17:21:27 · 6870 阅读 · 7 评论 -
【C#】WindowsAPICodePack-Shell使用教程
1.首先在项目中添加WindowsAPICodePack的Nuget包。 点击安装即可。2.获取《我的电脑》的名字和电脑图标ShellObject so = ShellFileSystemFolder.FromParsingName(KnownFolders.Computer.ParsingName); displayName = so.Name; Bitmap bm = so.Thumbnail.SmallBitmap;原创 2017-05-25 11:39:37 · 10735 阅读 · 1 评论 -
【C#】wpf查找父子节点
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Media;namespace TestSeagate.Common{原创 2017-05-24 10:22:22 · 1417 阅读 · 0 评论 -
【C#】获取"我的电脑"的名字,如This PC、这台计算机
注意:这里获取的我的电脑的名字,不是机器的名字。如图所示:1.定义ShellAPI类 public static class ShellAPI { public const int MAX_PATH = 260; public const uint CMD_FIRST = 1; public const uint CMD_L原创 2017-04-28 16:13:27 · 4048 阅读 · 0 评论 -
【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的
初学WPF,知道一些控件,可以通过定义Style的Trigger改变要显示的样式,但是经常遇到一些明明Trigger已经触发了,但是里面Setter设置的样式,却没有效果的问题。其实主要原因,是样式重复定义导致的。举个例子:原创 2017-03-08 13:24:36 · 3640 阅读 · 1 评论 -
【VS】vs2012解决nuget下载太慢的问题
众所周知,由于网络的原因,国内访问nuget服务器一直都很慢。而我们经常使用的nuget 包可能会有几十M的大小,不挂vpn的话,下一天可能都下载不下来,现在就给大家一个下载nuget离线包的方法。以vs2012为例:1.打开nuge官网:https://www.nuget.org比如我想下载cefsharp这个包,就先搜索,然后出现搜索结果之后。点击左边的“Download”原创 2017-01-20 13:48:17 · 18960 阅读 · 3 评论 -
【C#】对“xxxx::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用。
最近在做项目的时候,出现了几次“对“xxxx::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。”异常。这种错误,一般出现在托管代码调用非托管代码的过程中,如C#程序要调用c++的某个函数,而这个函数正好有个callback函数。当C#调用完之后,GC有可能会把这个cal原创 2016-12-14 16:30:07 · 13701 阅读 · 4 评论 -
【C#】VS2012+InstallShield2013制作软件更新包
上篇文章介绍了如何使用installshield制作软件的安装包,见地址:这次来介绍一下,当软件有更新时,如何制作一个更新包,自动删除旧软件,安装新软件。首先打开你的安装部署项目,我的是Setup1.的General Information文件,如我左边圈住的有三个重要的项。Product Version:你本次产品的版本号,每次发布新产品,这个的Version号,要增加一下。我上次的原创 2016-12-12 16:44:53 · 3704 阅读 · 0 评论 -
【C#】webbrowser过滤js弹出广告
在webbrowser的navigated事件中指定过滤规则: private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { //设定过滤广告规则 HtmlElementCollection hec = webBrowser1原创 2016-10-19 10:39:57 · 2004 阅读 · 0 评论 -
【C#】解决lucene.net在建立索引的时候,出现“算数运算导致溢出”stackoverflow exception的错误
环境:lucene.net 2.9 +vs2012.,在 new IndexWriter()的时候出现了这个问题。半天不能解决。最后换成了lucene.net 3.0解决了。原创 2016-10-06 13:38:18 · 977 阅读 · 0 评论 -
【C#】一个简单的windows服务程序
Thread th; public Service1() { InitializeComponent(); } protected override void OnStart(string[] args) { ThreadStart ts = new ThreadSta原创 2016-08-03 17:17:22 · 620 阅读 · 0 评论 -
【C#】打印控件中的内容和打印窗体中的内容
效果示意:操作步骤:1、新建winform项目及创建窗体2、拖取 打印 相关控件 PageSetupDialog 、 PrintDialog 、 PrintDocument 、PrintPreviewDialog3、设置上述控件的Document属性为相应的PrintDocument4、设置按钮等控件 及 添加相应按钮事件5、示意代码转载 2016-03-31 20:05:57 · 11874 阅读 · 1 评论 -
路径中 斜杠/和反斜杠\ 的区别
最近在项目中遇到了一个小问题,纠结了半天。路径中使用斜杠/和反斜杠\的区别到底是什么。查阅了一些资料后可知。Unix使用斜杆/ 作为路径分隔符,而web应用最新使用在Unix系统上面,所以目前所有的网络地址都采用 斜杆/ 作为分隔符。Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠\ 作为路径分隔符。所以目前windows系统上转载 2016-03-16 14:07:19 · 956 阅读 · 0 评论 -
【DevExpress】gridControl常用操作
1.隐藏GroupPanel表头设置Run Design->OptionsView->ShowGroupPanel 设置为:false2.隐藏列标题和左侧的IndicatorRun Design->OptionsView->ShowColumnHeadersRun Design->OptionsView->ShowIndicator2.gri...原创 2016-03-14 14:02:12 · 1918 阅读 · 0 评论 -
【C#】C#读取Excel中的数据
1.连接字符串中的:Microsoft.Ace.OleDb.12.0。既可以连接xls文件又可以连接xlsx文件,不建议使用Microsoft.Jet.OLEDB.4.0了,这个只能连接xls的excel.2.连接字符串中的txtPath.Text就是你的excel文件的路径名,如:C:\Users\Jim\Desktop\2016.2.24.xlsx。其中的HDR=YES,是声明Excel表中的第一行是列名而不是数据,HDR=NO,则相反。3.如果读取到的Excel中有空白行数据,就用sql语句中的i原创 2016-03-08 14:28:12 · 988 阅读 · 0 评论