关于c#:纯手撸WinForm的Alert提示弹出框

纯手撸WinForm的Alert弹框一、窗体设置设置以下属性: 属性名属性值阐明AutoScaleModeNone确定屏幕分辨率或字体更改时窗体如何缩放BackColor103, 194, 58背景色FontMicrosoft Sans Serif, 14.25pt字体FormBorderStyleNone标题栏和边框款式ShowIconFalse是否显示窗体图标ShowInTaskBarFalse是否显示在Windows任务栏Size450,100窗体大小TopMostTrue窗口置顶二、界面控件两个PictureBox和一个Label以及一个定时器,控件大小大家本人定义吧,PictureBox设置SizeMode的值为Zoom,Label的ForeColor为white,AutoSIze为True。 成果如下: 三、代码以及思路1.首先新建三个枚举类:AlertTypes.cs、ActionType.cs、ShowDirection.csAlertTypes管制弹框的类型,ActionType弹框的状态,ShowDirection弹框的显示地位 public enum AlertType{ /// <summary> /// 胜利 /// </summary> Success, /// <summary> /// 提醒 /// </summary> Info, /// <summary> /// 谬误 /// </summary> Error, /// <summary> /// 正告 /// </summary> Warning}public enum ActionType{ /// <summary> /// 期待 /// </summary> wait, /// <summary> /// 开启 /// </summary> start, /// <summary> /// 敞开 /// </summary> close}public enum ShowDirection{ /// <summary> /// 头部核心 /// </summary> TopCenter, /// <summary> /// 右下角 /// </summary> BottomRight, /// <summary> /// 右上角 /// </summary> TopRight,}2.思路1.滑动的成果通过能够通过定时器批改地位 ...

July 26, 2022 · 5 min · jiezi

关于c#:C-11-的新特性和改进前瞻

.NET 7 的开发还剩下一个多月就要进入 RC,C# 11 的新个性和改良也行将敲定。在这个工夫点上,不少新个性都曾经实现结束并合并入主分支。C# 11 蕴含的新个性和改良十分多,类型零碎相比之前也有了很大的加强,在确保动态类型平安的同时大幅晋升了语言表达力。那么本文就依照方向从 5 个大类来进行介绍,一起来提前看看 C# 11 的新个性和改良都有什么。 类型零碎的改良▌形象和虚静态方法C# 11 开始将 abstract 和 virtual 引入到静态方法中,容许开发者在接口中编写形象和虚静态方法。接口与抽象类不同,接口用来形象行为,通过不同类型实现接口来实现多态;而抽象类则领有本人的状态,通过各子类型继承父类型来实现多态。这是两种不同的范式。在 C# 11 中,虚静态方法的概念被引入,在接口中能够编写形象和虚静态方法了。 interface IFoo{ // 形象静态方法 abstract static int Foo1(); // 虚静态方法 virtual static int Foo2() { return 42; }}struct Bar : IFoo{ // 隐式实现接口办法 public static int Foo1() { return 7; }}Bar.Foo1(); // ok因为运算符也属于静态方法,因而从 C# 11 开始,也能够用接口来对运算符进行形象了。 interface ICanAdd<T> where T : ICanAdd<T>{ abstract static T operator +(T left, T right);}这样咱们就能够给本人的类型实现该接口了,例如实现一个二维的点 Point: ...

July 22, 2022 · 7 min · jiezi

关于c#:再谈C-Winforms桌面应用程序实现跨窗体间委托传值实例

文章首发于 码友网 -- 《再谈C# Winforms桌面应用程序实现跨窗体间委托传值(实例)》 前言对于C# Winforms桌面应用程序跨窗体传值其实是一个陈词滥调的问题了。我之前在码友网也写过多篇C# Winforms桌面应用程序跨窗体传值的实例文章,比方: 《C# WINFORM窗体间通过委托和事件传值(自定义事件参数)--实例详解》 《C#/.NET WINFORM中应用委托和事件在类中更新窗体UI控件》 那为什么还要“再谈”C# Winforms桌面应用程序跨窗体委托传值呢?因为对于绝大多数C#&.NET老手来说,要学习并熟练掌握C#的委托,事件等是比拟难的知识点,须要开发者一直地学习和我的项目实际。 并且,实现C# Winforms窗体间传值的计划也并不止一种,本文将为C#&.NET开发者们演示应用一种非凡的委托(delegate)--Action来实现的跨窗体传值实例。 成果预览本实例次要演示的是联系人治理,其中包含新建联系人,联系人列表等性能。 实例的最终预览成果如下: 创立解决方案及我的项目关上Visual Studio 2022,创立一个用于测试的解决方案,命名为:WindowsFormsApp1,再在解决方案中创立名为WindowsFormsApp1的我的项目。 别离新建三个Winform窗体:FrmMain,FrmCreate,FrmList 和一个联系人的类Contact.cs 联系人类(Contact.cs)定义如下: using System;namespace WindowsFormsApp1.Models{ /// <summary> /// 联系人 /// </summary> public class Contact { public Guid Id { get; set; } public string Name { get; set; } public string Email { get; set; } }}主窗体FrmMain.cs using System;using System.Collections.Generic;using System.Windows.Forms;using WindowsFormsApp1.Models;namespace WindowsFormsApp1{ public partial class FrmMain : Form { private List<Contact> _contacts; public FrmMain() { _contacts = new List<Contact>(); InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var frm = new FrmCreate(); frm.OnContactCreated = (contact) => { _contacts.Add(contact); }; frm.ShowDialog(); } private void button2_Click(object sender, EventArgs e) { var frm = new FrmList(_contacts); frm.ShowDialog(); } }}在主窗体,【新建联系人】按钮事件中,创立了FrmCreate的实例frm,同时为frm实例设置了回调(委托)OnContactCreated,这一步是委托传值的要害。 ...

July 19, 2022 · 1 min · jiezi

关于c#:HybridCLR划时代的Unity原生C热更新技术

HybridCLR是一个个性残缺、零老本、高性能、低内存的近乎完满的Unity全平台原生C#热更计划。 HybridCLR裁减了IL2CPP的代码,使它由纯AOT Runtime变成“AOT+Interpreter“混合Runtime,进而原生反对动静加载Assembly,使得基于IL2CPP Backend打包的游戏不仅能在Android平台,也能在iOS、Consoles等限度了JIT的平台上高效地以AOT+interpreter混合模式执行。 HybridCLR开创性地实现了“Differential Hybrid Dll“技术。即能够对AOT Dll任意增删改,会智能地让变动或者新增的类和函数以Interpreter模式运行,但未改变的类和函数以AOT形式运行,让热更新的游戏逻辑的运行性能根本达到原生AOT的程度。 HybridCLR(wolong)原作者walon(focus-creative-games创始人)将该系列课程放入UWA学堂连载更新,现已【收费上线UWA学堂】,本文先带大家对HybridCLR——划时代的Unity原生C#热更新技术有个简略的理解,更多内容可返回UWA学堂查看。 1. 根底概念1.1 CLRCLR即Common Language Runtime,中文叫公共语言运行时,是让.NET程序执行所需的内部服务的汇合,是.NET平台的外围和最重要的组件,相似于Java的JVM。更具体介绍请看《公共语言运行时 (CLR) 概述》。 1.2 IL2CPPIL2CPP是Unity开发的跨平台CLR解决方案,诞生它的一个要害起因是Unity须要跨平台运行。但一些平台如iOS,这种禁止JIT并导致依赖JIT的官网CLR虚拟机无奈运行,而是必须应用AOT技术将Mananged程序提前转化为指标平台的动态原生程序后再运行。而Mono尽管也反对AOT,但性能较差以及跨平台反对不佳。 IL2CPP计划蕴含一套AOT运行时以及一套DLL到C++代码及元数据的转换工具,使得原始的C#开发的代码最终能在iOS这样的平台运行起来。 1.3 IL2CPP与热更新很可怜,不像Mono有Hybrid mode execution,可反对动静加载DLL。IL2CPP是一个纯动态的AOT运行时,不反对运行时加载DLL,因而不反对热更新。 目前Unity平台的支流热更新计划xLua、ILRuntime之类都是引入一个第三方VM(Virtual Machine),在VM中解释执行代码,来实现热更新。这里咱们只剖析应用C#为开发语言的热更新计划。这些热更新计划的VM与IL2CPP是独立的,意味着它们的元数据系统是不相通的,在热更新里新增一个类型是无奈被IL2CPP所辨认的(例如,通过System.Activator.CreateInstance是不可能创立出这个热更新类型的实例),这种看起来像,但实际上又不是的伪CLR虚拟机,在与IL2CPP这种简单的CLR运行时交互时,会产生极大量的兼容性问题,另外还有重大的性能问题。 一个大胆的想法是,是否有可能对IL2CPP运行时进行裁减,增加Interpreter模块,进而实现Mono hybrid mode execution这样机制?这样一来就能彻底反对热更新,并且兼容性极佳。对开发者来说,除了解释模式运行的局部执行得比较慢,其余方面跟规范的运行时没有区别。 对IL2CPP加以理解并且三思而行后的答案是——的确是可行的!具体分析参见第二节《对于HybridCLR可行性的思维试验》 。这个想法诞生了HybridCLR,Unity平台第一个反对iOS的跨平台原生C#热更新计划! 2. 原理HybridCLR裁减了IL2CPP运行时,将它由AOT运行时革新为“AOT + interpreter”双引擎的混合运行时,进而完满反对在iOS这种禁止JIT的平台上以解释模式无缝地运行动静加载的DLL。如下图所示: 更具体一些,至多须要实现以下性能: 加载和解析DLL元数据动静注册元数据,其中要害为Hook动静函数的执行流到解释器函数实现一个高效正确的解释器正确处理GC及多线程等运行时机制3. 个性3.1 规范运行时个性近乎残缺实现了ECMA-335标准,不反对的个性仅包含: 不反对Delegate的BeginInvoke,EndInvoke。纯正是感觉没必要实现。不反对MonoPInvokeCallbackAttribute。意味着你如果同时还接了Lua,你没法间接将热更新的C#函数注册到Lua中,但有一个不简单的方法能做到这点。因为HybridCLR极其残缺的实现,让应用HybridCLR后的C#开发体验跟Editor下Mono开发简直完全相同(除了调用一些IL2CPP没实现的.net framework函数,非专家级别的开发者难以结构出HybridCLR不反对的用例)。 另外,因为是运行时级别的实现,HybridCLR反对这些个性的同时,不须要你额定生成或者调整任何代码。对于开发者来说,相比Unity下原生C#开发,零额定的学习和开发成本。 3.2 AOT相干个性因为IL2CPP AOT模块的存在,IL2CPP比规范运行时多了一些不存在的机制,因而HybridCLR也有一些额定的个性: 反对应用Interpreter Assembly替换AOT Assembly(限度:必须不存在其余AOT Assembly对它的间接援用)。反对补充元数据机制,彻底反对AOT泛型,参见《AOT泛型限度及原理介绍》。反对AOT Hotfix,能够修复AOT模块的Bug。反对任意C#函数注册到Lua之类的虚拟机,不限于Static函数,并且也不须要MonoPInvokeCallbackAttribute。条件是注册和回调形式须要稍微调整。3.3 Unity相干个性 完满反对Unity的Assembly Def模块机制。完满反对代码中挂载热更新脚本,无应用场景限度完满反对资源上挂载热更新脚本,但要求打包工作流有少许调整,参见《MonoBehaviour相干工作流》。4. 与其余风行的C#热更新计划的区别从原理来说,HybridCLR简直将热更新技术做到实践上的极限,与以后所有支流热更新计划不在一个档次。 4.1 实质比拟HybridCLR是原生的C#热更新计划。艰深地说,IL2CPP相当于Mono的AOT模块,HybridCLR相当于Mono的Interpreter模块,两者合一成为残缺Mono。HybridCLR使得IL2CPP变成一个全功能的Runtime,原生(即通过System.Reflection.Assembly.Load)反对动静加载DLL,从而反对iOS平台的热更新。 正因为hHybridCLR是原生Runtime级别实现,热更新局部的类型与主工程AOT局部类型是齐全等价并且无缝对立的。能够随便调用、继承、反射或多线程,不须要生成代码或者写适配器。 其余热更新计划则是独立VM,与IL2CPP的关系实质上相当于Mono中嵌入Lua的关系。因而类型零碎不对立,为了让热更新类型可能继承AOT局部类型,须要写适配器,并且解释器中的类型不能为主工程的类型零碎所辨认。个性不残缺、开发麻烦、运行效率低下。 4.2 理论应用体验或者个性比拟 HybridCLR学习和应用老本简直为零。HybridCLR让IL2CPP变成全功能的Runtime,学习和应用老本简直为零,简直零侵入性。而其余计划则有大量的坑和须要躲避的规定,学习和应用老本较高,须要对原我的项目作大量革新。HybridCLR能够应用所有C#的个性,而其余计划往往有大量的限度。HybridCLR中能够间接反对应用和继承主工程中的类型,其余计划要写适配器或者生成代码。HybridCLR中热更新局部元数据与AOT元数据无缝对立,像反射代码可能失常工作的,AOT局部也能够通过规范Reflection接口创立出热更新对象。其余计划做不到。HybridCLR对多线程反对良好。像多线程、ThreadStatic、Async等等个性都是HybridCLR间接反对,其余计划除了Async个性外均难以反对。HybridCLR中Unity工作流与原生简直完全相同。HybridCLR中热更新MonoBehaviour能够间接挂载在热更新资源上,并且正确工作。其余计划不行。HybridCLR兼容性极高。各种第三方库只有在IL2CPP下能工作,在HybridCLR下也能失常工作。其余计划往往要大量魔改源码。HybridCLR内存效率极高。HybridCLR中热更新类型与主工程的AOT类型齐全等价,占用一样多的空间。其余计划的等同类型则是假类型,不仅不能被Runtime辨认,还多占了数倍空间。HybridCLR执行效率高。HybridCLR中热更新局部与主工程AOT局部交互属于IL2CPP外部交互,效率极高。而其余计划则是独立虚拟机与IL2CPP之间的效率,不仅交互麻烦还效率低下。5. 运行性能理论性能如实践预计,全面并且大幅胜出以后支流的xLua、Puerts、ILRuntime之类的热更新计划。 根底指令(数值计算及条件跳转等指令),因为各个语言之间差距不大,因而胜出不显著。对象模型指令。因为没有跨语言交互的老本,简直是数倍到数十倍的晋升(如果指令本身耗费特地大,则差距不那么显著)。性能测试用例来自ILRuntime提供的规范测试用例,测试项目来自Don't worry的github仓库。 测试结果显示,绝大多数测试用例都有数倍到数十倍的性能差距,差距极其夸大。唯独数值计算跟xLua有大量劣势,这是因为以后HybridCLR未对指令作任何优化,后续优化版本大多数根底指令都将有100~300%的性能晋升。 6. 内存HybridCLR是运行时级别的实现,因为热更新的脚本,除了执行代码是以解释模式执行,其余形式跟AOT局部的类型是完全相同的,包含占用内存。 6.1 对象内存大小比照Lua的计算规定略简单,参见《Lua数据结构和内存占用剖析》。空Table占56字节,每多一个字段至多多占32字节。 ...

July 15, 2022 · 1 min · jiezi

关于c#:开课预告79月学习课程基于MASA-Framework的EShop实战

July 14, 2022 · 0 min · jiezi

关于c#:容错熔断的使用与扩展

@[toc] 一、容错机制的介绍概念 当客户端调用微服务的时候,呈现了故障,可能进行故障转移,就是容错机制。如图: 目标保障微服务的高可用。 二、为什么应用容错机制故障转移机制如图:三、如何在微服务中利用容错机制实现条件 while实现步骤 int count = 0; //故障转移 for(int i=0;i<=3;i++) { //判断是否达到阀值 if (count == 3) { //退出循环,返回异样信息 throw Exception("微服务重试操作超出阀值"); } //业务代码 try { // HttpClient 申请微服务代码 ................... } catch(Exception ex) { //捕捉异样信息 count ++; } } 四、容错机制的缺点缺点 性能低,耗资源解决方案 设置固定的次数应用熔断机制 五、如何在微服务零碎中应用Polly熔断 概念熔断的是一个申请。当申请到服务器的时候,该申请重试了3次【测试次数】,没有申请胜利,间接熔断该申请,下次申请进来,不用再去重试,间接返回异样信息。条件 Polly代码实现 条件 装置 Polly步骤 装置 Microsoft.Extensions.Http.Polly在Startup.cs 文件中注册 办法名 ConfigureServices //异样降级信息 var fallBack = new HttpResponseMessage(){ Content = new StringContent("零碎忙!"), StatusCode = 504 }; //5:断路器阀值 //10:熔断工夫 //ExecutionRejectedException:捕捉熔断的所有异样信息 //10:应用的线程总数 services.AddHttpClient("micro[申请复用:自定义名称]") .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<ExecutionRejectedException>().Fallback(fallBack)) //异样信息降级 .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().CircuitBreakerAsync(5,TimeSpan.FromSeconds(10))) //断路器 .AddPolicyHandler(Policy.TimeoutAsync<HttpResponseMeaage>(60))//设置超时工夫 .AddPolicyHandler(Policy<HttpResponseMeaage>.Handle<Exception>().RetryAsync(1))//重试次数 .AddPolicyHandler(Policy.BulkheadAsync<HttpResponseMeaage>(10,100));//资源(线程)隔离 //10:应用的线程总数 100:申请缓存总数业务代码 ...

July 13, 2022 · 1 min · jiezi

关于c#:5-数据访问-EntityFramework集成

前言Masa提供了基于EntityFramework的数据集成,并提供了数据过滤与软删除的性能,上面咱们将介绍如何应用它? MasaDbContext入门装置.Net 6.0新建ASP.NET Core 空我的项目Assignment.MasaEntityFramework,并装置Masa.Contrib.Data.EntityFrameworkCore、Swashbuckle.AspNetCore、Microsoft.EntityFrameworkCore.InMemory、Microsoft.EntityFrameworkCore.Tools dotnet add package Masa.Contrib.Data.EntityFrameworkCore --version 0.4.0-rc.4dotnet add package Swashbuckle.AspNetCore --version 6.2.3dotnet add package Microsoft.EntityFrameworkCore.InMemory --version 6.0.5dotnet add package Microsoft.EntityFrameworkCore.Tools --version 6.0.5装置Swashbuckle.AspNetCore是为了不便通过Swagger来操作服务装置Microsoft.EntityFrameworkCore.InMemory是为了不便,因而应用内存数据库,如果须要应用其余数据库,请自行装置对应的包装置Microsoft.EntityFrameworkCore.Tools是为了应用CodeFirst创立数据库新建类User public class User{ public int Id { get; set; } public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; } public DateTime CreationTime { get; set; } public User() { this.CreationTime = DateTime.Now; }}新建用户上下文UserDbContext.cs ...

July 5, 2022 · 3 min · jiezi

关于c#:Modbus协议通信异常

@[toc] 一、Modbus协定通信异样地址范畴 从站地址:1-247:无效的地址范畴 0:播送数据异样(数据无奈失常解析) 大小端存储问题异样解决原理(响应异样) 由从机明确回复性能码高地位 1如图:异样信息含意 代码名称含意01非法性能对于服务器(或从站)来说,询问中接管到的性能码是不可容许的操作。这兴许是因为性能码仅仅实用于新设施而在被选单元中是不可实现的。同时,还指出服务器(或从站)在谬误状态中解决这种申请,例如:因为它是未配置的,并且要求返回寄存器值。02非法数据地址对于服务器(或从站)来说,询问中接管到的数据地址是不可容许的地址。特地是,参考号和传输长度的组合是有效的。对于带有100 个寄存器的控制器来说,带有偏移量96 和长度4的申请会胜利,带有偏移量96和长度5的申请将产生异样码02。03非法数据值对于服务器(或从站)来说,询问中包含的值是不可容许的值。这个值批示了组合申请残余构造中的故障,例如:隐含长度是不正确的。并不意味着,因为MODBUS 协定不晓得任何非凡寄存器的任何非凡值的重要意义,寄存器中被提交存储的数据项有一个应用程序冀望之外的值。04从站设施故障当服务器(或从站)正在设法执行申请的操作时,产生不可从新取得的过错。05确认与编程命令一起应用。服务器(或从站)曾经承受申请,并切正在解决这个申请,然而须要长的持续时间进行这些操作。返回这个响应避免在客户机(或主站)中产生超时谬误。客户机(或主站)能够持续发送轮询程序实现报文来确定是否实现解决。06隶属设施忙与编程命令一起应用。服务器(或从站)正在解决长持续时间的程序命令。张服务器(或从站)闲暇时,用户(或主站)应该稍后从新传输报文。08存储奇偶性过错与性能码20和21 以及参考类型6一起应用,批示扩大文件区不能通过一致性校验。服务器(或从站)设法读取记录文件,然而在存储器中发现一个奇偶校验谬误。客户机(或主方)能够从新发送申请,但能够在服务器(或从站)设施上要求服务。0A不可用网关门路与网关一起应用,批示网关不能为解决申请调配输出端口至输入端口的外部通信门路。通常意味着网关是谬误配置的或过载的。0B网关指标设施响应失败与网关一起应用,批示没有从指标设施中取得响应。通常意味着设施未在网络中。申请频率异样 RTU报文申请距离 3.5个字符工夫 1.5个字符工夫报文长度限度 0x07D0 线圈的单次申请长度0x007D 寄存器单词申请的长度

July 2, 2022 · 1 min · jiezi

关于c#:4-对象映射-MappingMapster

前言在我的项目中咱们会常常遇到对象的映射,比方像Model和Dto之间的映射,或者是对象的深拷贝,这些都是须要咱们本人实现的。此时,我的项目中会呈现很多初始化对象的代码,这些代码写起来相当的枯燥乏味,那么有没有什么方法加重咱们的工作量,使得咱们能够把工夫破费到业务性能上呢? 目前,.Net中的对象映射框架,功能强大且性能极佳的对象映射框架曾经存在,其中应用最多的有: MapsterAutoMapper说到对象映射框架,大家想到的最多的是AutoMapper,可能很多人连Mapster都没听过,但不可否认的是Mapster的确是一个很好的对象映射框架,但因为中文文档的缺失,导致在国内知名度不是很高,明天咱们就来介绍一下Mapster提供了哪些性能,如何在我的项目中应用它,Masa提供的Mapster又做了什么? Mapster 简介Mapster是一个应用简略,功能强大的对象映射框架,自2014年开源到当初曾经过来8个年头,截止到当初,github上曾经领有2.6k的star,并放弃着每年3次的发版频率,其性能与AutoMapper相似,提供对象到对象的映射、并反对IQueryable到对象的映射,与AutoMapper相比,在速度和内存占用方面体现的更加优良,能够在只应用1/3内存的状况下取得4倍的性能晋升,那咱们上面就来看看Mapster如何应用? 筹备工作新建一个控制台我的项目Assignment.Mapster,并装置Mapster dotnet add package Mapster --version 7.3.0映射到新对象新建类UserDto public class UserDto{ public int Id { get; set; } public string Name { get; set; } public uint Gender { get; set; } public DateTime BirthDay { get; set; }}新建一个匿名对象,作为待转换的对象源 var user = new{ Id = 1, Name = "Tom", Gender = 1, BirthDay = DateTime.Parse("2002-01-01")};将user源对象映射到为指标对象 (UserDto) var userDto = user.Adapt<UserDto>();Console.WriteLine($"映射到新对象,Name: {userDto.Name}");运行控制台程序验证转换胜利: 数据类型除了提供对象到对象的映射,还反对数据类型的转换,如: 根本类型提供类型映射的性能,相似Convert.ChangeType() string res = "123";decimal i = res.Adapt<decimal>(); //equal to (decimal)123;Console.WriteLine($"后果为:{i == int.Parse(res)}");运行控制台程序: ...

July 1, 2022 · 2 min · jiezi

关于c#:在Word文档中添加下拉列表控件-CVBNET

下拉列表是内容控件的一种,是咱们比拟罕用的一个性能。它可能限定编辑的内容,只能抉择列表里的数据录入,不便填写的同时,保障了录入数据的准确性。在微软Word中,增加控件的性能默认是敞开的,须要关上开发工具能力增加控件。但在Word文档中增加内容控件并非只能通过微软Word实现,还可通过编程实现。通过代码增加内容控件无需微软Word,同时可能集成到本人的我的项目、程序中,对于开发者来说十分不便。本文将介绍用代码实现在Word文档中增加下拉列表控件的操作方法。本文所用到的办法须要一个收费的Word库的,Free Spire.Doc for .NET,需先引入DLL文件才可在代码中援用。 1. 通过Nuget引入1.1 在Nuget治理界面中搜寻FreSpire.Doc装置。1.2 在控制台输出以下代码装置。PM> Install-Package FreeSpire.Doc 小标题2. 手动下载增加DLL拜访Free Spire.Doc for .NET官网,下载并解压文件,而后在我的项目依赖项中增加DLL文件。 在Word文档中增加下拉列表增加下拉列表的具体操作步骤如下: 创立 Document 类的对象。用 Document.LoadFromFile() 办法从磁盘载入Word文档。在文档中增加一个段落。创立内容控件。用 Paragraph.ChildObjects.Add() 办法将内容控件插入到创立的段落中。用 StructuredDocumentTagInline.SDTProperties.SDTType 属性将内容控件设置为下拉列表控件(DropDownList)。用 StructuredDocumentTagInline.SDTProperties.ControlProperties 属性增加下拉列表选项。用 StructuredDocumentTagInline.SDTContent.ChildObjects.Add() 办法设置下拉列表显示的选项。用 Document.SaveToFIle() 办法保存文档。代码示例: using System;using System.Drawing;using Spire.Doc;using Spire.Doc.Fields;using Spire.Doc.Documents;namespace AddContentControl{ internal class Program { static void Main(string[] args) { //创立Word文档 Document document = new Document(); //从磁盘加载Word文档 document.LoadFromFile(@"C:\Users\Allen\Desktop\Sample3.docx"); //在文档中增加一个段落 Section section = document.Sections[0]; Paragraph paragraph = section.AddParagraph(); TextRange text = paragraph.AppendText("下拉列表控件: "); text.CharacterFormat.FontSize = 14; text.CharacterFormat.FontName = "微软雅黑"; //创立内容控件 StructureDocumentTagInline sd = new StructureDocumentTagInline(document); //将内容控件插入到创立的段落 paragraph.ChildObjects.Add(sd); //将内容控件的类型设置为下拉列表控件 sd.SDTProperties.SDTType = SdtType.DropDownList; //增加下拉列表选项 SdtDropDownList sddl = new SdtDropDownList(); sddl.ListItems.Add(new SdtListItem("选项1")); sddl.ListItems.Add(new SdtListItem("选项2")); sddl.ListItems.Add(new SdtListItem("选项3")); sd.SDTProperties.ControlProperties = sddl; //设置下拉列表显示的选项 TextRange rt = new TextRange(document); rt.Text = sddl.ListItems[0].DisplayText; sd.SDTContent.ChildObjects.Add(rt); //保存文档 document.SaveToFile("Output.docx", FileFormat.Docx); } }}增加成果示意: ...

June 30, 2022 · 1 min · jiezi

关于c#:CVBNET-如何在Word中插入日期选择控件

微软Word提供了一个日期抉择控件的性能,不便日期数据的录入与填写。如果想要在微软Word中,增加日期抉择控件,须要当初选项中关上开发者工具,而后才能够增加日期抉择控件。如果想要将增加日期选择器的操作通过代码实现,可应用本文行将介绍的办法,通过简略的代码,无需微软Word就可在Word文档中增加日期抉择控件。本文所介绍的办法须要用到收费的Free Spire.Doc for .NET,须要先引入DLL文件。 1. 通过Nuget引入1.1 在Nuget治理界面中搜寻FreSpire.Doc装置。1.2 在控制台输出以下代码装置。PM> Install-Package FreeSpire.Doc 2. 手动下载增加DLL拜访Free Spire.Doc for .NET官网,下载并解压文件,而后在我的项目依赖项中增加DLL文件。 在一个Word文档中增加日期抉择控件增加日期抉择控件的具体操作步骤如下: 创立Word文档。用 Document.LoadFromFile() 办法从磁盘载入Word文档。在文档中增加一个段落。创立内容控件。用 Paragraph.ChildObjects.Add() 办法将内容控件插入到创立的段落中。用 StructuredDocumentTagInline.SDTProperties.SDTType 属性将内容控件设置为日期抉择控件(DatePicker)。用 SdtDate.CalendarType 属性设置日历类型。用 SdtDate.DateFormat 属性设置日期格局。用 StructuredDocumentTagInline.SDTProperties.ControlProperties 设置控件内容为日期。用 StructuredDocumentTagInline.SDTContent.ChildObjects.Add() 办法设置控件显示日期。用 Document.SaveToFile() 办法保存文档。代码示例:using System;using System.Drawing;using Spire.Doc;using Spire.Doc.Fields;using Spire.Doc.Documents;namespace AddContentControl{ internal class Program { static void Main(string[] args) { //创立Word文档 Document document = new Document(); //从磁盘加载Word文档 document.LoadFromFile(@"C:\Users\Allen\Desktop\Sample3.docx"); //在文档中增加一个段落 Section section = document.Sections[0]; Paragraph paragraph = section.AddParagraph(); TextRange text = paragraph.AppendText("日期抉择控件: "); text.CharacterFormat.FontSize = 14; text.CharacterFormat.FontName = "微软雅黑"; //创立内容控件 StructureDocumentTagInline sd = new StructureDocumentTagInline(document); //将内容控件插入到创立的段落 paragraph.ChildObjects.Add(sd); //将内容控件的类型设置为日期抉择控件 sd.SDTProperties.SDTType = SdtType.DatePicker; //设置日历类型 SdtDate date = new SdtDate(); date.CalendarType = CalendarType.Default; //设置日期格局 date.DateFormat = "yyyy.MM.dd"; //设置控件内容为日期 date.FullDate = DateTime.Now; sd.SDTProperties.ControlProperties = date; //设置控件显示日期 TextRange rt = new TextRange(document); rt.Text = "2022.06.30"; sd.SDTContent.ChildObjects.Add(rt); //保存文档 document.SaveToFile("Output.docx", FileFormat.Docx); } }}增加成果示意: ...

June 30, 2022 · 1 min · jiezi

关于c#:NET-如何在Word中插入组合框Combo-Box

组合框(Combo Box)是文本框和下拉列表的组合,同时容许编辑者在列表抉择我的项目显示和输出内容。它是Word文档中一个十分实用的性能,对于比拟固定的一些数据,如性别、地点,或是几个我的项目的抉择等,用组合框就能够不便数据录入,又容许对于数据的增加。增加组合框可通过代码实现,无需微软Word或是其余文档编辑软件,可将代码集成到本人的程序中实现该性能。本文将介绍通过代码实现增加组合框到Word文档中的操作方办法。本文所介绍的办法须要借助收费Word库Free Spire.Doc for .NET,需引入DLL文件以及插件到我的项目中应用。 1. 通过Nuget引入1.1 在Nuget治理界面中搜寻FreSpire.Doc装置。1.2 在控制台输出以下代码装置。PM> Install-Package FreeSpire.Doc 2. 手动下载增加DLL在Free Spire.Doc for .NET官网下载解压文件,而后在我的项目依赖项中增加DLL文件。 在Word文档中插入组合框具体操作步骤如下: 通过创立 Document 类的对象创立Word文档。用 Document.LoadFromFile() 办法从磁盘加载Word文档。用 Section.AddParagraph() 办法在文档第一节中增加一个段落。在增加的段落中增加文字并设置字号、字体。通过创立 StructureDocumentTagInline 的对象创立内容控件。用 Paragraph.ChildObjects.Add() 办法将内容控件插入到定位的段落。用 SdtType.ComboBox 属性将内容控件的类型设置为组合框。通过创立 SdtComboBox 的对象创立组合框控件。用 SdtComboBox.ListItems.Add() 办法设置组合框控件的选项。f用 SdtComboBox.ListItem[].DisplayText 属性抉择下拉列表第二个选项,并用 SDTContent.ChildObjects.Add(rt) 办法将该选项增加为显示的选项。用 Document.SaveToFile() 办法保存文档。代码示例: using System;using System.Drawing;using Spire.Doc;using Spire.Doc.Fields;using Spire.Doc.Documents;namespace AddContentControl{ internal class Program { static void Main(string[] args) { //创立Word文档 Document document = new Document(); //从磁盘加载Word文档 document.LoadFromFile(@"C:\Users\Allen\Desktop\New Microsoft Word Document (2).docx"); //在文章第一节中增加一个段落 Section section = document.Sections[0]; Paragraph paragraph = section.AddParagraph(); //在增加的段落中增加文字并设置字号、字体 TextRange text = paragraph.AppendText("组合框控件: "); text.CharacterFormat.FontSize = 14; text.CharacterFormat.FontName = "微软雅黑"; //创立内容控件 StructureDocumentTagInline sd = new StructureDocumentTagInline(document); //将内容控件插入到创立的段落 paragraph.ChildObjects.Add(sd); //将内容控件的类型设置为组合框 sd.SDTProperties.SDTType = SdtType.ComboBox; //创立组合框控件 SdtComboBox cb = new SdtComboBox(); //设置组合框控件的选项 cb.ListItems.Add(new SdtListItem("A")); cb.ListItems.Add(new SdtListItem("B")); cb.ListItems.Add(new SdtListItem("C")); //将组合框控件插入到后面创立的内容控件 sd.SDTProperties.ControlProperties = cb; //将组合框控件设置为显示第二个选项 TextRange rt = new TextRange(document); rt.Text = cb.ListItems[1].DisplayText; sd.SDTContent.ChildObjects.Add(rt); //保存文档 document.SaveToFile("Output.docx", FileFormat.Docx); } }}增加成果示意: ...

June 28, 2022 · 1 min · jiezi

关于c#:CVBNET-把网页文件HTML转换为PDF文档

HTML(超文本标记语言)是一种罕用于展现网页的标记语言,而HTML文件则是这种标记语言所对应的文件格式,绝大多数网页文件都采纳这种格局。但HTML文件在不同设施、不同平台上,可能呈现排版展现成果不同的问题。如果咱们想让文件展现出的页面保持一致,可将其转换为PDF文件进行保留和传输。本文介绍一种十分不便的办法,通过简略编程实现HTML文件转换为PDF文件。也可将这种转换方法集成到别的程序中,使程序实现转换性能。此办法需应用收费的Free Spire.PDF for .NET,需援用DLL文件到我的项目中应用。 1. 通过Nuget装置1.1 在Nuget治理界面中搜寻FreSpire.PDF装置。1.2 在控制台输出以下代码装置。PM> Install-Package FreeSpire.Doc 2. 手动下载增加DLL在Free Spire.PDF for .NET官网下载解压文件,而后在我的项目依赖项中增加DLL文件。 将一个HTML文件转换为PDF文件转换的具体操作步骤如下: 创立 PdfDocument 类的对象。用 PdfDocument.LoadFromHTML() 办法从url加载HTML文件。用 PdfDocument.SaveToFile() 办法保留为PDF文件。代码示例://创立PdfDocument类的对象PdfDocument doc = new PdfDocument();//从URL加载HTML文件String url = "https://www.baidu.com/";Thread thread = new Thread(() =>{ doc.LoadFromHTML(url, false, true, true); });thread.SetApartmentState(ApartmentState.STA);thread.Start();thread.Join();//保留为Pdf文件doc.SaveToFile("sample.pdf");转换成果示意: 以上代码中援用的代码均来自收费的Free Spire.PDF for.NET。

June 23, 2022 · 1 min · jiezi

关于c#:NET-PDF转WordDocDocx

PDF文件是一种用于贮存和传输内容的文件格式,其传输内容的形式与操作系统、应用程序以及硬件无关,因而可能在各个平台进行内容传递并放弃其显示成果。但PDF文件在编辑内容的时候不太不便,且反对编辑的利用大多免费。而Word文档是一种非常适合编辑及贮存内容的文件,Word文档的编辑软件功能丰富、使用方便,是比拟常见软件。如果咱们能够将PDF文件转为Word文档,内容编辑就会变得十分不便。本文将介绍通过简略的编程,将PDF文件转为Word文档,包含Doc和Docx。本文所应用的转换方法须要用到收费Office库Free Spire.PDF for .NET,首先须要引入dll文件。 1.应用Nuget可在Nuget治理中搜寻Free Spire.PDF装置,或在控制台输出以下代码装置:PM> Install-Package FreeSpire.PDF 2.手动增加在Free Spire.PDF for .NET官网下载解压,将dll增加到依赖项中。 将PDF文档转换为Word文档转换代码非常简单,仅需三个步骤: 创立 PdfDocument 类的对象。应用 PdfDocument.LoadFromFile() 办法从磁盘加载PDF文档。应用 PdfDocument.SaveToFile() 办法将PDF文档转换为Word文档并保留,可抉择Word文档格局。代码示例:C# using Spire.Pdf;namespace PDFToWord{ class Program { static void Main(string[] args) { //创立PdfDocument类的对象 PdfDocument pdf = new PdfDocument(); //加载PDF文档 pdf.LoadFromFile("Sample.pdf"); //将PDF文档转为Word文档并保留,可抉择格局 pdf.SaveToFile("result.docx", FileFormat.Docx); } }}VB.NET Imports Spire.PdfNamespace PDFToWord Class Program Private Shared Sub Main(args As String()) '创立PdfDocument类的对象 Dim pdf As New PdfDocument() '加载PDF文档 pdf.LoadFromFile("Sample.pdf") '将PDF文档转换为Word文档并保留,可抉择Word文档格局 pdf.SaveToFile("result.docx", FileFormat.Docx) End Sub End ClassEnd Namespace转换成果示例: ...

June 17, 2022 · 1 min · jiezi

关于c#:C免注册调用大漠插件

免注册调用大漠插件,实际上是应用 dmreg.dll 来配合实现,这个文件有 2 个导出接口 SetDllPathW 和 SetDllPathA。 SetDllPathW 对应 unicode,SetDllPathA 对应 ascii 接口。 一、下载大漠插件下载地址:大漠插件解压实现后,如下图所示: 再解压 dm.rar、大漠类库生成工具.rar、免注册.rar,解压密码为:1234 解压实现后,如下图所示: 二、生成大漠类库#关上 大漠类库生成工具 文件夹,如下图所示: 关上 大漠类库生成工具 v24.0.exe 文件,如下图所示: 将 dm\7.2149\dm.dll 拖到 大漠类库生成工具 外面,如下图所示: 类名抉择应用自定义类名,指定类名输出 DmSoftCustomClassName(这里只是示例,你能够输出你喜爱的名字,如:abcde、aabbc、abab 等),如下图所示: 点击生成按钮,如下图所示: 关上 dm\7.2149\Output\C# 文件夹,能够看到生成的后果,如下图所示: 生成的 obj.cs 即是应用在 C# 平台下的类库封装,稍后在 C# 免注册调用大漠插件的示例中会用到。 三、创立控制台应用程序#我这里创立的是 .NET Core 3.1 的控制台应用程序,你也能够创立你喜爱的。 3.1 引入大漠插件 dll#在我的项目中创立 libs 文件夹,用于搁置大漠插件的 dll,如下图所示: dm.dll 在 dm\7.2149 文件夹下,如下图所示: DmReg.dll 在 免注册\不注册调用dm.dll的办法 v11.0 文件夹下,如下图所示: 设置 dll 属性 复制到输入目录 为 始终复制: 在 dm.dll 上单击鼠标右键,抉择 属性;在属性面板中,“复制到输入目录”选项,抉择“始终复制”;在 DmReg.dll 也反复下面的操作。 3.2 引入大漠类库#在我的项目中创立 DmSoft 文件夹,用于搁置大漠类库。 将之前生成的大漠类库(obj.cs)复制到我的项目中的 DmSoft 文件夹,并改名为 DmSoftCustomClassName(能够改名,也能够不改名,还能够改成任意名,你喜爱就好……),如下图所示: 3.3 创立 Resources 文件夹#在我的项目中创立 Resources 文件夹,用于搁置大漠插件应用到的资源,比方图片、字库等,如下图所示: ...

June 11, 2022 · 3 min · jiezi

关于c#:MASA-Auth-从用户的角度看整体设计

用户在零碎里,用户是一个外围概念。它代表了一个人的惟一身份标识,除了与角色、团队、组织架构等无关,甚至还会影响到在同一个界面不同的用户操作流程与显示内容都会发生变化,再简单一点的话,或者在同一个零碎内的一个用户进入到不同产品后的身份也会变动 用户与角色用户能够领有一个或多个角色,让角色作为权限组,将一组或多组权限间接的调配给用户 用户与团队用户能够在多个团队中,每个团队能够领有一个或多个角色,将一组或多组权限通过角色与团队关联,并赋予团队内的成员 团队内成员能够是外部的,也能够是内部的。通过对立的用户表作为人的惟一身份标识。再通过Employee和ThirdPartyUser辨别用户身份属性。 用户与组织架构用户能够被指定在组织架构的某一个节点中 但组织架构是一个虚构的树形构造,它归属于业务,所以没有与权限间接关联 除此之外,组织架构有时候很难示意角色继承关系。在同一个组织架构节点中的不同成员经常会具备不同的角色,且上下级关系也未必会作为上下级节点紧贴在一起。有局部公司上下级之间可能隔了几个层级 组织架构在咱们晚期定义中是与权限关联且没有团队这个概念的。但实际上我的项目制在很多公司外部都存在,以我的项目制运行时,人员的权限和虚构组织关系会频繁变动。导致经常要在组织架构调整和大量集体权限微调上做抉择,为了彻底解决这种割裂的行为。咱们把组织架构看作虚构的树形构造来形容每个人的部门归属权,同时采纳团队的形式解决我的项目制下人员频繁进出和到处作战而引发的权限变更问题 用户与权限用户除了领有角色以外,可能还存在个别非凡业务下须要临时性授予或禁用局部权限 尽管与RBAC2有一点抵触,但事实上这样的场景确实存在,比方行将到职的财务须要长期发出付款性能,这里显著要违反互斥准则,在设计上咱们的抉择是扩大权限的优先级高于角色内蕴含的权限。这样能够通过对冲达到发出局部敏感权限的性能 用户类型用户有三种类型:终端用户,员工,驻场员工 举个例子: A是公司员工,领有外部权限。同时也是公司产品的终端用户B是驻场员工,领有局部外部权限。同时也是公司产品的终端用户 用户权限优先级用户的权限应该具备肯定的优先级,来解决同一个业务下多个权限同时失效时零碎该抉择激活哪一个 咱们将采纳以下规定: 超级管理员/管理员 超级管理员为系统管理员,管理员为指定我的项目的管理员用户的扩大配置权限用户的角色权限 用户的角色权限抵触时,回绝优先级高于容许,低于用户的扩大配置权限团队的默认角色权限团队中的父级角色权限 未来在团队反对上下级关系后,以后用户没有被调配到权限,且以后团队存在父级时将向上递归查找间隔最近的默认角色来取得权限列表用户权限类型用户的权限类型大略分为四类 菜单:是否能够通过菜单拜访某个页面页面元素:是否能够对页面内的元素进行操作,如按钮。页面元素须要挂在菜单下数据:是否显示指定字段。数据须要挂在菜单下 数据与页面元素相似,但与页面元素之间互相独立API:是否能够拜访指定API。API个别须要挂在菜单或页面元素下,如有须要也能够挂在数据下 权限层级 总结至此,咱们从一个用户的角度将角色和权限,前端与后端都串联了起来。但到目前为止还是概念的梳理阶段,做好一个权限核心很难。每个团队有本人的治理形式,如何在不同的团队需要中摘取到共同点把主线串联起来,既能满足绝大部分场景需要又留有扩大余地依然须要工夫去验证。 (本文章不代表最终设计) 参考: https://uxdesign.cc/design-pe... 开源地址MASA.BuildingBlocks:https://github.com/masastack/... MASA.Contrib:https://github.com/masastack/... MASA.Utils:https://github.com/masastack/... MASA.EShop:https://github.com/masalabs/M... MASA.Blazor:https://github.com/BlazorComp... 如果你对咱们的 MASA Framework 感兴趣,无论是代码奉献、应用、提 Issue,欢送分割咱们

June 7, 2022 · 1 min · jiezi

关于c#:NET-PDF中删除页面

PDF 文档通过页面来出现文字、图片等元素,一个 PDF 文档通常有多个页面。有时, PDF 文档中会有一些空白的,或全是不必要、无关内容的页面,尤其是在那些从网络取得的 PDF 文档中。咱们能够用 Spire.PDF for .NET 来删除这些页面。本文将教大家如何应用 Spire.PDF for .NET 删除PDF页面。 引入DLL一、 通过NuGet装置右键单击解决方案中的依赖项,找到“治理NuGet包”,在其中搜寻“FreeSpire.PDF”并增加到援用项中。复制上面代码到控制台装置PM> Install-Package FreeSpire.PDF 二、 手动增加DLL在Free Spire.PDF for .NET官网下载免费版后解压,在解决方案中找到依赖项,右键单击找到增加援用项,找到Spire.PDF.dll并增加到援用项中。 删除页面操作步骤用此工具删除页面非常简单,通过解决甚至可实现疾速删除多个文件的多个页面,具体操作步骤如下: 创立 PdfDocument 的对象。用 PdfDocument.LoadFromFile() 办法从磁盘载入 PDF 文档。用 PdfDocument.Pages.RemoveAt() 办法删除第三页和第二页。用 PdfDocument.SaveToFile() 办法保留 PDF 文档。C# 代码using System;using Spire.Pdf;namespace RemovePage{ internal class Program { static void Main(string[] args) { //创立 PdfDocument 的对象 PdfDocument pdf = new PdfDocument(); //从磁盘载入 PDF 文档 string input = @"D:\testp\示例.pdf"; pdf.LoadFromFile(input); //删除第三页和第二页 pdf.Pages.RemoveAt(1); pdf.Pages.RemoveAt(2); //保存文档 string output = "删除页面.pdf"; pdf.SaveToFile(output); } }}VB.NET 代码Imports SystemImports Spire.PdfModule Program Sub Main(args As String()) '创立 PdfDocument 的对象 Dim pdf As New PdfDocument() '从磁盘载入 PDF 文档 Dim input As String = "D:\testp\示例.pdf" pdf.LoadFromFile(input) '删除第三段和第二段 pdf.Pages.RemoveAt(2) pdf.Pages.RemoveAt(1) '保存文档 Dim output As String = "删除页面.pdf" pdf.SaveToFile(output) End SubEnd Module删除成果示意: ...

June 2, 2022 · 1 min · jiezi

关于c#:C跨PC远程调用程序并显示UI界面

在我的项目中有一个需要是须要在局域网内跨PC近程调用一个程序,并且要求有界面显示,考察了一些材料,能实现近程调用的.Net技术大略有PsExec、WMI、Schedule Task。 这三种形式都做了一个尝试,后果发现PsExec、WMI都只能在过程列表中看到程序执行,却无奈显示界面,无奈执行程序中的管理员权限操作,就连简略的在C盘创立一个txt文本都做不到。 兴许是我应用办法不对,无奈达到我的需要。直到起初应用了Schedule Task的形式之后,才胜利实现了我的需要。 第三种技术的次要思路是先通过CMD窗口调用schtasks命令在近程PC上创立一个单次执行的打算工作,在打算工作中调用内部程序,而后立刻执行,能够显示界面,并且能够执行管理员权限的操作。 用到的schtasks命令: string queryTaskArg = string.Format(@" /query /s {0} -u domainname\{1} -p {2} /tn install", ip, username, password);string creatTaskArg = string.Format(@" /create /s {0} -u domainname\{1} -p {2} /sc ONCE /st 10:00 /tn installSelector /tr {3} /rl HIGHEST /ru Local /IT", ip, username, password, installPath);string runTaskArg = string.Format(@" /run /s {0} -u domainname\{1} -p {2} /tn install", ip, username, password); ;string deleteTaskArg = string.Format(@" /delete /s {0} -u domainname\{1} -p {2} /tn install /F", ip, username, password);schtasks /create 创立打算工作 ...

May 15, 2022 · 2 min · jiezi

关于c#:微软是如何解决-PC-端程序多开问题的

不久前,在尝试应用 C# 解决 PC 端程序多开问题时,发现 VB.NET 的 WinForm 程序提供了一个非常简单的实现形式: 无需任何代码,只需打个勾。 我对它的实现原理很感兴趣,因而对其进行了探索。明天就通过这篇文章为大家介绍微软是如何解决 PC 端程序多开问题的,以及如何在 C# 中实现雷同性能。   原理1——WindowsFormsApplicationBase基类编译一个 VB.NET 的 WinForm 程序,反编译源代码,找到入口Main办法: 该入口类MyApplication继承自WindowsFormsApplicationBase基类,理论执行的基类的Run办法。Run办法外部应用IsSingleInstance属性判断是否启用单个实例应用程序: 而IsSingleInstance属性在入口类的构造函数中被赋值: 实现1通过援用 NuGet 包 Microsoft.VisualBasic,咱们在 C# 中同样能够继承WindowsFormsApplicationBase基类,为IsSingleInstance属性赋值,实现单个实例应用程序: class Program : WindowsFormsApplicationBase{ public Program() { IsSingleInstance = true; } protected override void OnCreateMainForm() { MainForm = new Form1(); } [STAThread] static void Main(string[] args) { new Program().Run(args); }}尽管上述实现非常简单,然而仅实用于 WinForm 应用程序,而且还须要援用Microsoft.VisualBasic类库。 因而,咱们决定深挖一下,看看具体是如何实现的。 原理2-命名管道通过查看WindowsFormsApplicationBase的Run办法实现(代码有删减): Public Sub Run(commandLine As String()) If Not IsSingleInstance Then DoApplicationModel() Else ' This is a Single-Instance application Dim pipeServer As NamedPipeServerStream = Nothing If TryCreatePipeServer(ApplicationInstanceID, pipeServer) Then ' --- This is the first instance of a single-instance application to run. Using pipeServer WaitForClientConnectionsAsync(pipeServer, AddressOf OnStartupNextInstanceMarshallingAdaptor, cancellationToken:=tokenSource.Token) DoApplicationModel() End Using Else Dim awaitable = SendSecondInstanceArgsAsync(ApplicationInstanceID, commandLine, cancellationToken:=tokenSource.Token).ConfigureAwait(False) awaitable.GetAwaiter().GetResult() End If End If 'Single-Instance applicationEnd Sub能够剖析出,微软解决 PC 端程序多开问题的外部实现原理如下: ...

May 11, 2022 · 2 min · jiezi

关于c#:qiao索引器

索引器(Indexer)索引器(Indexer) 容许一个对象能够像数组一样应用下标的形式来拜访。 当您为类定义一个索引器时,该类的行为就会像一个 虚构数组(virtual array) 一样。您能够应用数组拜访运算符 [ ] 来拜访该类的的成员。 语法一维索引器的语法如下: element-type this[int index]{ // get 拜访器 get { // 返回 index 指定的值 } // set 拜访器 set { // 设置 index 指定的值 }}索引器(Indexer)的用处索引器的行为的申明在某种程度上相似于属性(property)。就像属性(property),您可应用 get 和 set 拜访器来定义索引器。然而,属性返回或设置一个特定的数据成员,而索引器返回或设置对象实例的一个特定值。换句话说,它把实例数据分为更小的局部,并索引每个局部,获取或设置每个局部。 定义一个属性(property)包含提供属性名称。索引器定义的时候不带有名称,但带有 this 关键字,它指向对象实例。上面的实例演示了这个概念: 实例 using System;namespace IndexerApplication{ class IndexedNames { private string[] namelist = new string[size]; static public int size = 10; public IndexedNames() { for (int i = 0; i < size; i++) namelist[i] = "N. A."; } public string this[int index] { get { string tmp; if( index >= 0 && index <= size-1 ) { tmp = namelist[index]; } else { tmp = ""; } return ( tmp ); } set { if( index >= 0 && index <= size-1 ) { namelist[index] = value; } } } static void Main(string[] args) { IndexedNames names = new IndexedNames(); names[0] = "Zara"; names[1] = "Riz"; names[2] = "Nuha"; names[3] = "Asif"; names[4] = "Davinder"; names[5] = "Sunil"; names[6] = "Rubic"; for ( int i = 0; i < IndexedNames.size; i++ ) { Console.WriteLine(names[i]); } Console.ReadKey(); } }}当下面的代码被编译和执行时,它会产生下列后果: ...

April 30, 2022 · 1 min · jiezi

关于c#:C-float浮点数与二进制相互转换IEEE754

Float32转二进制C#中浮点数的二进制格局遵循IEEE754规范(IEEE二进制浮点数算术规范)。 以小数11.25为例,float32的二进制值为:01000001001101000000000000000000 这个值是怎么来的呢?IEEE754是一个对于浮点数的规范,它把浮点数分成3个局部:Sign(符号)|Exponent(指数)|Mantissa(尾数) Sign(符号) 示意浮点数的正负(大于等于0为0,小于0为1)Exponent(指数) 示意浮点数的指数(相似迷信计数法的指数局部)Mantissa(尾数) 示意有效数字(相似迷信计数法的有效数字)以下内容简称这3局部别离为S、E、M Float32占32位,8位一字节共4字节: S(1位)|E(8位 偏移127)|M(23位) 即:0 | 1000 0010 | 01101000000000000000000S、E、M 这3局部是怎么确定的呢? 比方11.25 示意成十进制的迷信计数法: 1.125x101符号是+,指数是1,有效数字是1.125 IEEE754是先把小数转成二进制,用二进制的迷信计数法示意该小数。还是以11.25为例:S为0 (这个数字大于等于0 符号S=0,如果小于0,符号S=1)把浮点数的整数局部和小数局部别离转成二进制,再拼到一起。 整数局部转二进制: 转换方法:整数除以2取余 倒序排列(除到整数局部为0)整数局部I为11,转成二进制为:1011 $$2\sqrt{11}=5···1 \qquad\enspace \\=2···1\\=1···0\\=0···1$$ 小数局部转二进制: 转换方法:小数乘以2取整 正序排列(乘到小数局部为0,即余数为0)小数局部F为0.25,转成二进制为:01 $$0.25\times2=0···0.5 \qquad\enspace\enspace \\=1···0$$ 整数和小数拼到一起: IF = 1011.01 以二进制迷信计数法表白: IF = 1.01101x23 指数局部E: E = 3, IEEE754规定这个值要加127E = 130 转成二进制为:1000 0010整数除以2取余 倒序排列(除到整数局部为0) $$2\sqrt{130}=65···0 \qquad\enspace\enspace \\=32···1\\=16···0\\=\enspace 8···0\\=\enspace 4···0\\=\enspace 2···0\\=\enspace 1···0\\=\enspace 0···1$$ 尾数局部M: M = 101101因为二进制的迷信计数法首位肯定为1, 1能够省略不写,尾数局部就变成了01101M = 01101 S、E、M三局部拼到一起: ...

April 27, 2022 · 3 min · jiezi

关于c#:C-sizeof-计算规则

1.sizeof的作用我集体的了解:sizeof是用来获取非托管类型所占内存大小的操作符。 微软官网对sizeof的定义: sizeof 运算符返回给定类型的变量所占用的字节数。 sizeof 运算符的参数必须是一个sizeof的名称,或是一个限定为非托管类型的类型参数。 《微软官网文档》https://docs.microsoft.com/zh... 2.sizeof和Mashal.sizeof首先要说的是sizeof和Marshal.SizeOf是有差别的。 C# 中的sizeof和Marshal.SizeOf都能够用来获取非托管类型的大小,然而性能上有差异,后果也略有差别。 sizeof在失常环境下只能用于预约义的非托管类型,如int、long等等。在unsafe环境下,sizeof能够被用于值类型,然而值类型中不能够有援用类型,否则C#编译器会报错。 Marshal.SizeOf则是取得该类型被Marshal(转换,通常翻译为列集,指数据从一种类型转换到另外一种类型)到对应的非托管类型的大小。和sizeof不同,Marshal.SizeOf容许用在含有援用类型的值类型上。 参考资料:《Marshal.SizeOf和sizeof的区别》 先看输入后果: public struct Struct1 { public int Id;}public struct Struct2 { public int Id; public string Name;}// sizeof()测试 零碎内置的根本类型sizeof是固定常量值,编译器主动替换,不是通过计算失去的 不须要用unsafe 自定义的须要unsafe下计算private void SizeofTest() { Console.WriteLine(sizeof(bool)); // 1 Console.WriteLine(sizeof(byte)); // 1 Console.WriteLine(sizeof(sbyte)); // 1 Console.WriteLine(sizeof(short)); // 2 Console.WriteLine(sizeof(ushort)); // 2 Console.WriteLine(sizeof(int)); // 4 Console.WriteLine(sizeof(uint)); // 4 Console.WriteLine(sizeof(long)); // 8 Console.WriteLine(sizeof(ulong)); // 8 Console.WriteLine(sizeof(char)); // 2 Console.WriteLine(sizeof(float)); // 4 Console.WriteLine(sizeof(double)); // 8 //自定义struct unsafe { Console.WriteLine(sizeof(Struct1));// 4 //Console.WriteLine(sizeof(Struct2));// 编译器报错 无奈获取托管类型("Struct2")的地址和大小,或者申明指向他的指针 }}// Mashal.SizeOf()测试private void MarshalSizeofTest() { // using System.Runtime.InteropServices; Console.WriteLine(Marshal.SizeOf(typeof(bool))); // 4 (sizeof是1) Console.WriteLine(Marshal.SizeOf(typeof(byte))); // 1 Console.WriteLine(Marshal.SizeOf(typeof(sbyte))); // 1 Console.WriteLine(Marshal.SizeOf(typeof(short))); // 2 Console.WriteLine(Marshal.SizeOf(typeof(ushort))); // 2 Console.WriteLine(Marshal.SizeOf(typeof(int))); // 4 Console.WriteLine(Marshal.SizeOf(typeof(uint))); // 4 Console.WriteLine(Marshal.SizeOf(typeof(long))); // 8 Console.WriteLine(Marshal.SizeOf(typeof(ulong))); // 8 Console.WriteLine(Marshal.SizeOf(typeof(char))); // 1 (sizeof是2) Console.WriteLine(Marshal.SizeOf(typeof(float))); // 4 Console.WriteLine(Marshal.SizeOf(typeof(double))); // 8 // 自定义struct Console.WriteLine(Marshal.SizeOf(typeof(Struct1)));// 4 Console.WriteLine(Marshal.SizeOf(typeof(Struct2)));// 8} 3.sizeof大小的计算在计算之前,请看下面SizeofTest()办法内的输入后果,记住根本数据类型的大小,用来计算。 ...

April 27, 2022 · 5 min · jiezi

关于c#:async-void-导致程序崩溃

起源:https://note.guoqianfan.com/2...前言之前都是在文档里看到:除了winform的事件能够应用async void,其余状况下相对不能应用async void,而是要用async Task。 对于这个标准,尽管不是很明确内里起因,然而始终恪守着。 直到这天看到了这篇博客:在 ASP.NET Core 中誤用 async void 竟引發了 502(Bad Gateway),说async void里出现异常时会导致程序解体。钻研测试了一番,终于明确起因。 摘录重点如下: 根據使用者提供的另一個線索「網站的某個性能壞了」,我們繼續往下追究,從程式碼當中我看到了一個近期新加的办法,它应用了 async void,沒錯,它应用了 async void,而且很可怜地它會發生 Exception,更慘的是這個 Exception 沒有被處理。 對 C# 非同步程式設計有理解的敌人,看到這邊應該大抵上能够晓得是發什麼問題了,async void 是建議應該防止应用的宣告形式,其中一個起因就是當 async void 办法發生 Exception 時無法從呼叫端捕獲,即便加了 try...catch... 也沒用,async void 办法就有點像是我們本人起了另一個 Thread 去執行程式一樣,執行的過程中如果發生 Exception 沒有去處理,Exception 就會一路被往上拋,最終在 AppDomain 層級被捕獲,然後我們的應用程式就掛了。 async-void-办法的异样无奈被捕捉async void办法抛出的异样无奈被捕捉,异样会被始终往上面抛,最终在AppDomain层级被捕捉,而后程序就挂了。 示例代码如下: [HttpGet]public async void Get(){ try { ThrowExceptionAsync(); } catch (Exception ex) { //这里不能捕捉到异样,程序解体! _logger.LogInformation(ex, "ex..."); }}async void ThrowExceptionAsync(){ throw new Exception("async void ex!");}留神后面所说的是 async void办法抛出的无奈预知到的异样。在async void办法外部,咱们依然可能应用try catch,逻辑是失常逻辑。具体见上面的示例: ...

April 23, 2022 · 1 min · jiezi

关于c#:C中的类型转换自定义隐式转换和显式转换

起源:https://note.guoqianfan.com/2...前言有时咱们会遇到这么一种状况:在json数据里,数组里的数据类型不统一,导致咱们不能间接反序列化为指标类型。最终咱们只能反序列化为JObject类型,而后通过字符串取值的形式来取出数据。 上面介绍一种新形式:通过自定义隐式转换,把不一样的数据类型反序列化为一样的数据类型。 基础知识类型转换有2种:隐式转换和显式转换。然而,不论是隐式转换,还是显式转换,都是生成了一个新对象返回的。扭转新对象的属性,不会影响老对象!(dynamic对象除外,详情搜寻dynamic动静类型。) 自定义隐式/显式转换的办法须要用到几个关键字:implicit(隐式转换)、explicit(显式转换)、operator(操作符)。更多的留神点见下: 办法必須是static应用implicit或explicit搭配operator(此也是c#關鍵字,可在類別或結構宣告內多載內建運算子或提供使用者定義的轉換)返回值为要转换为的指标类型,但不要在办法上申明,办法名为指标类型。留神:返回值不肯定是本类类型。本类型和其余类型之间能够相互转换,只有定义转换方法就行。参数为原始类型,办法名为指标类型类A到类B的类型转换定义不能在类C中进行(即2个类的转换不能在第3个类中定义),否则会报错:用户定义的转换必须是转换成关闭类型,或者从关闭类型转换。具体查看前面的用户定义的转换必须是转换成关闭类型,或者从关闭类型转换不能被virtual/override润饰(不能“笼罩”运算符,因为它们是动态的。)Overriding implicit operators in C#示例代码//================定义类型和办法================class Robot{ public int Id { get; set; } public string Name { get; set; } public Robot(int id, string name) { Id = id; Name = name; } #region 其余类型->本类 //隐式转换 public static implicit operator Robot(string name) { return new Robot(101, name); } //显式转换 public static explicit operator Robot(int id) { return new Robot(id, "miku"); } #endregion #region 本类->其余类型 //隐式转换 public static implicit operator string(Robot robot) { return robot.Name; } //显式转换 public static explicit operator int(Robot robot) { return robot.Id; } #endregion}//================测试代码================#region 其余类型->本类string gumiStr = "gumi";Robot gumi001 = gumiStr; //隐式转换Console.WriteLine("隐式转换:gumi001 : {0}", JsonConvert.SerializeObject(gumi001));int lukaId = 1004;Robot luka001 = (Robot)lukaId; //显式转换Console.WriteLine("显式转换:luka001 : {0}", JsonConvert.SerializeObject(luka001));#endregion#region 其余类型->本类Robot miku001 = new Robot(1001, "miku10001");//隐式转换string mikuName = miku001;//显式转换int mikuId = (int)miku001;Console.WriteLine("隐式转换:miku001 Name: {0}", mikuName);Console.WriteLine("显式转换:miku001 Id: {0}", mikuId);#endregion输入后果如下: ...

April 22, 2022 · 2 min · jiezi

关于c#:6-堪比JMeter的Net压测工具-Crank-实战篇-收集诊断跟踪信息与如何分析瓶颈

1. 前言下面咱们曾经做到了接口以及场景压测,通过控制台输入后果,咱们只须要将后果收集整理下来,最初汇总到excel上,此次压测报告就能够实现了,但收集报告也挺麻烦的,交给谁呢…… 找了一圈、没找到违心接手的人,该怎么办呢……思考了会儿还是决定看看是否通过程序解决咱们的难题吧,毕竟整顿表格太累╯﹏╰ 2. 收集后果通过查阅官网文档,咱们发现官网提供了把数据保留成Json、csv、以及数据库三种形式,甚至还有小伙伴踊跃的对接要把数据保留到Es中,那选个最简略的吧! 要不抉择Json吧,不须要依赖内部存储,很简略,我感觉应该可试,试一下看看:输出命令: crank --config load.benchmarks.yml --scenario api --load.framework net5.0 --application.framework net5.0 --json 1.json --profile local --profile crankAgent1 --description "wrk2-获取用户详情" --profile defaultParamLocal最初失去后果: { "returnCode": 0, "jobResults": { "jobs": { "load": { "results": { "http/firstrequest": 85.0, "wrk2/latency/mean": 1.81, "wrk2/latency/max": 1.81, "wrk2/requests": 2.0, "wrk2/errors/badresponses": 0.0, "wrk2/errors/socketerrors": 0.0, "wrk2/latency/50": 1.81, "wrk2/latency/distribution": [ [ { "latency_us": 1.812, "count": 1.0, "percentile": 0.0 }, { "latency_us": 1.812, "count": 1.0, "percentile": 1.0 } ] ] } } } }}残缺的导出后果好吧,数据有点少,如同数据不太够吧,这些信息怎么解决能做成报表呢,再说了数据不对吧,QPS、提早呢?好吧,被看进去了,因为信息太多,我删了一点点(也就1000多行指标信息吧),看来这个不行,用json的话还得配合个程序好难…… ...

April 20, 2022 · 2 min · jiezi

关于c#:为VisualStudio新建文件创建版权日期模板

1.为什么创立模板文件?在没有创立模板文件时,VisualStudio默认创立的文件是这样的。 能够看到,没有任何正文、版权信息和创立日期等。而在创立模板文件后,VisualStudio默认创立的文件是这样的。 这在后续批改代码文件或多人合作项目时有莫大的益处。上面就来说说怎么创立并批改默认模板。 2.新建模板文件留神:我所用环境为Visual Studio 2022,以下模板适宜C#10新语法,旧语法及旧版本以相似办法批改。2.1在空白目录创立以下三个文件: Class.cs // ----------------------------------------------------------------// Copyright ©$year$ ZhaiFanhua All Rights Reserved.// FileName:$safeitemname$// Guid:$guid1$// Author:$username$// Email:me@zhaifanhua.com// CreateTime:$time$// ----------------------------------------------------------------namespace $rootnamespace$;/// <summary>/// $safeitemrootname$/// </summary>public class $safeitemrootname${}Controller.cs 这里仅为ApiController // ----------------------------------------------------------------// Copyright ©$year$ ZhaiFanhua All Rights Reserved.// FileName:$safeitemname$// Guid:$guid1$// Author:$username$// Email:me@zhaifanhua.com// CreateTime:$time$// ----------------------------------------------------------------using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Mvc;namespace $rootnamespace$;/// <summary>/// $safeitemrootname$/// </summary>[Route("api/[controller]")][ApiController]public class $safeitemname$ : ControllerBase{}Interface.cs // ----------------------------------------------------------------// Copyright ©$year$ ZhaiFanhua All Rights Reserved.// FileName:$safeitemname$// Guid:$guid1$// Author:$username$// Email:me@zhaifanhua.com// CreateTime:$time$// ----------------------------------------------------------------namespace $rootnamespace$;/// <summary>/// $safeitemrootname$/// </summary>public interface $safeitemrootname${}2.2找到模板目录并复制例如装置的Visual Studio 2022在C盘,则对应的模板目录在: ...

April 16, 2022 · 1 min · jiezi

关于c#:5-堪比JMeter的Net压测工具-Crank-实战篇-接口以及场景压测

1. 前言通过之前的学习,咱们曾经把握了crank的配置以及对应http基准工具bombardier、wrk、wrk2的用法,本篇文章介绍一下如何将其用于实战,在理论的我的项目中咱们如何应用crank来实现压测工作。 2. 我的项目背景目前有一个我的项目,咱们心愿通过压测来理解其QPS、吞吐量、以及临界值,并通过压测来剖析出其瓶颈在哪里?并通过解决瓶颈问题以进步QPS、吞吐量等指标 先看下咱们手头把握了什么: 我的项目信息 我的项目中的接口根本都须要登录通过与开发沟通能够失去每个页面的接口信息以及参数信息环境信息 压测我的项目有独自的环境部署利用、Redis、数据库等根底配置此处我的项目名咱们暂定为ProjectA。 3. 如何发展首先咱们先回顾一下Agent、Controller的职责以及特点 Controller 做任务调度以及后果输入无需独自服务器,能够在本机执行发送命令,须要与Agent相通Agent 工作的理论执行者单任务执行,不能做到接管到多个工作并同时执行,先收到哪个工作,哪个工作会先执行雷同一个工作能够被多个Agent同时执行,最终指标后果会主动累加,能够通过晋升Agent来模仿更高的并发能力3.1. 思路先做好独自接口的压测,大略把握每个接口的指标状况同时压测多个接口,实现对场景的压测通过压测察看应用服务器、根底服务器的CPU、带宽、内存等指标,察看Redis、数据库、音讯队列等根底组件状况,依据压测的返回后果失去每个场景的根底指标通过剖析发现瓶颈、而后再思考如何冲破瓶颈,晋升QPS、吞吐量等3.2. 如何做?理解到单个Agent同时执行多个工作会进行排队,无奈做到多任务同时执行,那么咱们能够通过多个Agent同时执行不同的工作来模仿用户拜访页面。 3.2.1. 构建Agent之前与开发沟通失去每个页面最多可发送的申请是6个,那么咱们筹备6个Agent,别离为Agent1、Agent2、Agent3、Agent4、Agent5、Agent6 咱们这里应用Docker来启动Agent、Agent对内凋谢端口: 5010、对外端口随机,镜像应用咱们自建的: doddgu/crankagent:net5.0 并新建load.yml为之后压测应用: profiles: crankAgent1: jobs: load: endpoints: - http://localhost:5010 crankAgent2: jobs: load: endpoints: - http://localhost:5011 crankAgent3: jobs: load: endpoints: - http://localhost:5012 crankAgent4: jobs: load: endpoints: - http://localhost:5013 crankAgent5: jobs: load: endpoints: - http://localhost:5014 crankAgent6: jobs: load: endpoints: - http://localhost:5015load.yml 中记录了所有的压测机信息,其信息个别不做批改,咱们能够作为公共的配置来应用无需每个我的项目都独自保护一份新的3.2.2. 构建压测脚本在这里咱们抉择wrk2作为本次基准测试工具,抉择wrk2的起因是: 反对随机参数可反对设置恒定的吞吐量负载具备wrk的所有性能此时咱们针对ProjectA我的项目新建配置:project.profiles.yml,作为本次压测的环境配置来应用,其配置如下 imports: - https://raw.githubusercontent.com/doddgu/crank/sample/samples/wrk2/common/load.profiles.yml # 这边倡议应用近程load.profiles.yml地址。(如果输出的是本地门路、则需输出与以后命令所在门路的相对路径)profiles: local: # 本地环境 variables: serverAddress: localhost # 应用服务域 serverPort: 80 # 应用服务端口 connections: 256 # 每个线程解决时放弃关上的 HTTP 连贯总数 N = 连接数/线程数 threads: 32 # 线程数 warmup: 3 # 预热工夫: 3s duration: 180 # 测试时长: 3分钟 rate: # 吞吐量参数(每秒总申请数)project.profiles.yml中记录了指定我的项目的各环境的配置,我的项目本人独立保护即可除了我的项目信息、压测机配置之外,咱们还须要有中央保护咱们压测的接口信息,这边我的做法是将api独立拆分进去,每个yml只配置一个接口的压测信息,至于为什么不放到一块,而要独自拆离开呢? ...

April 15, 2022 · 3 min · jiezi

关于c#:AgileConfig-160-发布-支持服务注册与发现

大家好,良久没有输入博文了,一是因为比较忙,另外一个起因是最近次要的精力是在给 AgileConfig 增加一个新的性能:服务注册与发现。 先说说为什么会增加这个性能。我本人的我的项目是用 Consul 来做为服务注册发现组件的。自从我上线了 AgileConfig 做为配置核心后,我就很少去 Consul 察看服务的在线状态了,因为 AgileConfig 客户端列表曾经在肯定水平上能代表服务的状态了。服务注册发现与配置核心其实实质上都是解决了一类问题,那就是配置的动态化,所以大家会看到业界驰名的组件很多都是同时实现这2个性能的,如 Consul,Nacos 等。所以我想罗唆把这个性能给加上吧,这样能够省去部署一个组件。 当然也有同学说我不务正业,不去好好搞配置核心去搞什么服务注册发现。然而我还是做了。。。不过大家释怀 AgileConfig 的主业还是在配置核心上,服务注册发现只是附赠的小菜,能够用也能够不必,决定权齐全在你。在实现上我也是对两个性能是齐全解耦的。也就是说这2个性能都是互不影响独立运行的。惟一有交加的一个中央是,如果配置核心的客户端的 websocket 通道建设胜利的时候,服务的心跳会借用这个通道。 ✨✨✨Github地址:https://github.com/dotnetcore/AgileConfig 开源不易,欢送star✨✨✨ ✨✨✨Gitee地址:https://gitee.com/kklldog/AgileConfig ✨✨✨ 什么是服务注册与发现首先先让咱们回顾下服务注册发现的概念。 在施行微服务之后,咱们的调用都变成了服务间的调用。服务间调用须要晓得IP、端口等信息。再没有微服务之前,咱们的调用信息个别都是写死在调用方的配置文件里(当然这话不相对,有些公司会把这些信息写到数据库等公共的中央,以不便保护)。又因为业务的简单,每个服务可能依赖N个其余服务,如果某个服务的IP,端口等信息产生变更,那么所有依赖该服务的服务的配置文件都要去批改,这样显然太麻烦了。有些服务为了负载是有个多个实例的,而且可能是随时会调整实例的数量。如果每次调整实例数量都要去批改其余服务的配置并重启那太麻烦了。为了解决这个问题,业界就有了服务注册发现组件。假如咱们有服务A须要调用服务B,并且有服务注册发现组件R。整个大抵流程将变成大略3部: 服务B启动向服务R注册本人的信息服务A从服务R拉取服务B的信息服务A调用服务B有了服务注册发现组件之后,当批改A服务信息的时候再也不必去批改其余相干服务了。 参考我的另外一篇:.Net Core with 微服务 - Consul 注册核心 应用服务注册与发现应用服务注册与发现性能须要更新服务端与客户端至 1.6.0 及以上版本。 启动服务端服务端更新至 latest 镜像或 v-1.6.0 以上的镜像。 应用 docker 运行服务端实例: sudo docker run \--name agile_config \-e TZ=Asia/Shanghai \-e adminConsole=true \-e db:provider=sqlite \-e db:conn="Data Source=agile_config.db" \-p 5000:5000 \#-v /your_host_dir:/app/db \-d kklldog/agile_config:latest根本的应用没有太大的变动,只是在界面上增加了服务的相干治理界面,这里不在赘述。 相干教程: .Net Core & Agile Config配置核心 ...

April 13, 2022 · 2 min · jiezi

关于c#:47c-新建线程Thread线程内与操作窗体控件

Thread t3 = new Thread(() => { Console.WriteLine("a2...."); WriteLog("ComListForm.t3.begin.."); RefreshListFormDb(); }); t3.IsBackground = true; t3.Start();RefreshListFormDb()须要更新datagridView: List<ComPhoneBean> list = rv_list.Value; MethodInvoker mi = new MethodInvoker(() => { WriteLog("ComListForm.RefreshListFormDb....5."); UpdateDataGrid(list); }); this.BeginInvoke(mi);UpdateDataGrid这个办法更新Datagridview的内容: private void UpdateDataGrid(List<ComPhoneBean> list) { WriteLog("ComListForm.UpdateDataGrid....1."); if (list==null || list.Count == 0) { WriteLog("ComListForm.UpdateDataGrid....2."); return; } WriteLog("ComListForm.UpdateDataGrid....3."); this.dataGridView1.Rows.Clear(); WriteLog("ComListForm.UpdateDataGrid....4."); int index = 0; foreach(ComPhoneBean bean in list) { index++; this.dataGridView1.Rows.Add(new string[] { "" + index, bean.ComPort, bean.Phone, "" + bean.SignalIntensity }); } WriteLog("ComListForm.UpdateDataGrid....5."); }

April 7, 2022 · 1 min · jiezi

关于c#:Masa-Blazor-in-Blazor-Day

2022年第一场Blazor中文社区的开发者分享流动,咱们的团队也全程参加其中,在议程中,也分享了咱们团队的Blazor 治理后盾模板,针对于Blazor,先科普一波,防止有些敌人不理解,Blazor是微软推出的基于.NET的前端技术。利用现有的.NET生态,受于.NET的性能,可靠性和安全性,不仅能过够在服务器和客户端之间共享利用程序逻辑,还可能在不同的操作系统上高效、稳固的运行。本次Masa Blazor 也是分享最新的Blazor技术停顿和开发实际。 Masa技术团队全程参加咱们分享的议题是“开源的Blazor治理后盾模板”。通过咱们开源的我的项目MASA Framework Admin开展介绍,顺次介绍了具体的性能、技术栈、分享了咱们的Masa Blazor的组件和Masa Blazor Pro,同时也具体的阐明了MASA Framework的环境怎么装置、怎么运行等... 具体的具体内容,咱们精简成文字版给到大家,当天没有参加直播的敌人们,看这篇就够啦~仅限咱们的分享局部哦! 背景咱们做这个事件,其实是很忽然的,之前咱们公司的外部搞了一个小型的黑客松,大家花了3天工夫,基于咱们的组件库和框架,就把这样的一个我的项目给大家做进去了,因为是刚做进去的,用时也较短,其实能够说,还是个“宝宝”。基本上的性能演示是曾经做进去了,没有那么欠缺,如果期待值很高,那还是须要给一些工夫的。 MASA Framework Admin 的性能 多点登录互斥,同一个账号,只能在一台电脑上登录如果开了隐衷模式的浏览器,或者是在另外一个电脑下面,登录同一个账号,那么之前登录的账号就会被踢掉,是一个很实用的性能,咱们也用Blazor去给大家演示,在Blazor下面是怎么做到这点)引入Dapr,提供Pubsub、Secret等示例Pubsub就是事件,咱们把MQ用起来了 Secret就是密钥这些,大家会习惯于放在.NET配置文件里,通过Secret就能够放到Dapr的配置文件外面 定时工作,提供根底的定时计算报表数据的示例只是简略的给大家提供了一个定时计算报表的示例RBAC0,引入Role的概念,并将权限与角色进行关联。用户通过表演某种角色,具备该角色的权限引入角色的概念,把权限和角色关联起来,让用户去表演某种角色,而后具备该角色的权限。如果用RBAC,依据业务的复杂性,大家更偏向于用RBAC3,但MASA Framework Admin是一个比较简单的货色,临时不会实现RBAC3这么简单的性能。如果你须要RBAC3,而后又须要单点登录,而后不同我的项目之间的关系治理等等...如果须要这样的货色,能够略微等一下。咱们预计在往年7月前后,会开源另一个我的项目,叫MASA Auth。MASA Auth是咱们MASA Stack外面的第一个正式开源的我的项目,外面会给大家提供十分残缺的权限性能,你拿过来用,能够满足绝大多数的要求,基本上是不须要二开的集成可观测性这个性能其实也是dapr提供的技术栈.Net 6DaprMASA BlazorMASA FrameworkDocker ComposeMASA Blazor组件库演示Masa Blazor组件库格调 Material Design 咱们做这个组件库的时候,是照着vuetify做的,基本上是1:1还原的 咱们做了本人的首页,也能够在首页,理解更多Masa Blazor的详情 通过首页点击“开始应用”,在装置局部,咱们提供了演示视频,大家能够依据视频去操作,如果不喜爱看视频,上面的命令行就比拟适宜你啦!间接疾速看命令行就能够了,都是比较简单的。 组件也是做了蛮多的,感兴趣的能够间接到官网,点击理解更多。 https://blazor.masastack.com/... 用过咱们组件库的小伙伴,反映说”示例少“,这里和大家讲一下起因,因为一个组件的性能很多,咱们不太可能,全副都做成示例,如果你想看下,支不反对更多的性能,能够如下图所示,点击API进入之后,就能够看到咱们的组件,提供了多少属性、插槽、事件等,用过vue的小伙伴,对插槽这些,应该很相熟。 ”MASA Blazor Pro“,MASA Blazor的实际Masa Blazor Pro其实是一个纯前端的我的项目,是没有任何业务端的,群里的小伙伴,始终都在说,咱们的Pro蛮难看的,然而没有后端的演示代码,心愿咱们补充一下,咱们做Admin也是有这样的一个契机。大家要的布局,而后多页签、面包屑...这些咱们都是有做的,还包含多语言i18n,性能还原度上,都是做了的。打的版本号上,咱们是激进了一点,当初为止,咱们还没有打1.0的版本。咱们心愿1.0版本是能够给到大家长期反对的,所以咱们对1.0的要求比拟高,但实际上0.3.0也是足够大家用的, 组件展现 MASA Blazor Pro效果图 MASA Framework介绍底层框架、后端代码的局部咱们用的是MASA Framework,当初看到的是咱们第一个版本的性能清单。我的项目的模板、Dapr Starter...如果你用Dapr,应该就有理解。Dapr D的边车,每次启动的时候,会比拟麻烦。所以咱们做了一个Dapr Starter,只须要一行代码,它会主动去帮你治理Dapr D的整个生命周期,包含配置、包含端口映射等等一系列的操作,全副都会帮你做好。 Building Blocks 是咱们提供的整个框架的接口标准,就是咱们提供了哪些性能,这些性能都是通过接口标准提供的。Contribe就是实现了Building Blocks这些接口的,而后咱们提供了一些,咱们认为,你在用这些性能的时候,可能默认要用的一些选项。在咱们Building Blocks 外面,除了一些数据类相干的、服务类相干的,还有比如说Event Bus,包含隔离性、可观测性等这些都是有的。 ...

April 6, 2022 · 1 min · jiezi

关于c#:2022首场MASA技术团队黑客松赛事大赛完美落幕精彩集锦

Masa技术团队在2021年创建,这一年咱们团队公布了咱们第一个产品,Masa Blazor。登上了.NET Conf China,咱们承诺,开源咱们的产品,为开源社区增砖加瓦,一路上播种技术社区文章类的各种奖项... 2022年,咱们在路上... 开年之初,为了激励更多的开发同学参加到我的项目落地的实际中,团队外部举办了第一季的黑客松大赛,目前,第一季的获奖名次曾经颁布,这个过程中,有哪些项目和亮点,是值得关注的呢? 赛事详情后果很重要,过程更重要!背景在团队成立之初,就抱着做产品,要“高标准、严要求”的态度,去落地咱们的产品。愿景是心愿咱们的产品,最终能够做到咱们slogan说的那样!“让变动更简略”,但产品落地过程中,团队的严密合作,也至关重要。独特向着同一个指标,做喜爱的事件。借助团队的力量,做好每一个产品,最初就是拿后果。而黑客松的模式,能够让大家在日常的工作中,跳脱进去,集中在一段时间,去更有创造力的实现一个新的我的项目,过程中的成长,可能比理论播种的处分,更感动人心。 赛事处分任何赛事的举办,肯定要有好的彩头去激励参赛者。本次赛事,团队创始人们给到参赛者的激励是,“第一名能够播种5000元现金处分”,以及对应的职级降职布局,还有代表荣誉的名次奖杯。经营悄悄地采访了一下冲动的参赛者们!大家都在悄咪咪的讲,“万一第一名是本人呢~对吧”! 赛事期间,能量加油站间接拉满~ 赛程实录较量工夫:2022/02/10-2022/02/12 为期三天 参赛团队、选题: 组选题团队第一组主控面板,对立登录(升高为jwt登录),后盾页面布局,在线用户数,拜访日志筷子队(2人)第二组用户治理,组织治理,项目管理,菜单治理,角色治理,rbac0RBAC(3人)第三组字典,定时工作(dll和http,包含例子,控制面板,异样告诉等),发送邮件,文件服务(minio)拍脑袋(3人)第四组博客后盾治理静止卫裤队(3人)第五组博客前台Blog(2人过程中,会有界面设计师与产品经理全程合作,助力每个团队。 业余评审团队谨严把关在赛事发布会时,对于评审团队的评审规范,以及评审的谨严、公平性做出公示。会通过围绕技术、产品、创新力等多个方面对参赛我的项目进行评比,最终筛选出了各赛道最具后劲的优质我的项目。但因为参赛人员,是公司外部开发同学,针对每个开发的实力,评审团队是十分分明的,所以对于每个开发的规范,肯定是有差异化期待,保障每个参赛团队都在偏心的赛道上发力。 赛事过后,评审工夫为期一周,这一周内,每个团队都会在规定的工夫内,针对本人做的我的项目,进行演示和问难。评审的过程中,每个团队都全力以赴,力求能够在无限工夫内,能够很好的演示,以及说出全副我的项目亮点,评审团队的问答也是非常的精彩。 各团队我的项目亮点为了给每个团队,一个独立施展的空间,赛事场地长期征用了公司的各个角落,仓库都安顿上啦 ! 但并不影响大家的施展呢~筷子队:操之过急的同时不乏亮点,像多点登录互斥、在线人数统计、定时工作、异步生产等。 RBAC:性能布局丰盛,界面简洁且有一些业务翻新。 拍脑袋:引入minio作为文件存储,往云原生的路线上后退。 静止卫裤队:竟然反对广告设置,满足了“资本大佬”的欲望。 Blog:反对敏感词检测,对政策竟然钻研的如此透彻。最终第一名团队是:筷子队获奖起因:较量正式开始之前,筷子队就曾经把根本的框架拉进去了,整个过程中很踊跃,同时也在我的项目里加了一些比拟好的性能,比方:同一个账号同时登录,会把原登录的账号挤掉这些,对理论的业务场景做了反对,包含咱们公司将来的产品也会用到这些,演示的过程中,是没有bug的,所以最终决定这个奖给到了筷子团队!这个是评审团最终做出的总结! 赛后我的项目落地的转化本次优胜团队的我的项目,收录到了咱们的Masa.Admin中, Masa.Admin实现了RBAC(权限治理)、多点登录互斥、拜访日志性能。技术栈用到了咱们的 Masa.Framework、Masa.Blazor。代码继续更新中,感兴趣的小伙伴们,能够间接去看代码 https://github.com/masalabs/M... Masa.Admin我的项目演示截图 面包屑 多页签 菜单 部门 角色 用户 用户组 本次赛事,圆满闭幕。赛事过后,团队针对赛事做了整体的复盘,好的局部,咱们持续保留,做的没那么好的局部,下次赛事,咱们持续欠缺,本次赛事采取了非公开模式。之前通过咱们的Masa Blazor等产品,积攒了很多的用户,非常感谢大家的关注,咱们也心愿,下次赛事,能够和更多的用户,有更好的互动,可能会采取线上直播的形式等,如果对咱们的团队感兴趣,也欢送大家退出咱们!凋谢的团队气氛,肯定能够感化每一个你。 咱们正在口头,新的框架、新的生态咱们的指标是自在的、易用的、可塑性强的、功能丰富的、强壮的。 所以咱们借鉴Building blocks的设计理念,正在做一个新的框架MASA Framework,它有哪些特点呢? 原生反对Dapr,且容许将Dapr替换成传统通信形式架构不限,单体利用、SOA、微服务都反对反对.Net原生框架,升高学习累赘,除特定畛域必须引入的概念,保持不造新轮子丰盛的生态反对,除了框架以外还有组件库、权限核心、配置核心、故障排查核心、报警核心等一系列产品外围代码库的单元测试覆盖率90%+开源、收费、社区驱动还有什么?咱们在等你,一起来探讨通过几个月的生产我的项目实际,已实现POC,目前正在把之前的积攒重构到新的开源我的项目中MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks MASA.Contrib:https://github.com/masastack/MASA.Contrib MASA.Utils:https://github.com/masastack/MASA.Utils MASA.EShop:https://github.com/masalabs/MASA.EShop MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor 如果你对咱们的 MASA Framework 感兴趣,无论是star、代码奉献、应用、提 Issue,欢送分割咱们 ------ END ------

April 1, 2022 · 1 min · jiezi

关于c#:体验了一把最近很火的开源项目MASA-Blazor

前言        很羞愧直到去年底才接触到Blazor。那什么是Blazor呢?置信大家都看过官网文档的具体阐明,另外MASA团队也有不错的阐明介绍 。用官网的话说Blazor是一个交互式客户端Web UI的框架,并且应用C#开发而不是JavaScript。好了言归正传,事件的起因是这样的,公司组织外部比赛须要用Blazor做一个简略的网页。为了能够更好的做出成果就简略的尝试了几个开源组件。 开源组件抉择         遇事不决先找官网Blazor 教程,跟着微软的教程会失去上面这个样子的页面。 嗯,还是挺清爽的...预计会被领导喷死吧。既然官网提供的款式太清爽。那就要想一下怎么弯道超车了。         于是乎开始网上冲浪,首先想到的是Bootstrap Blazor组件库,也没有什么特地的起因可能只是因为以前常常用它写后盾页面吧。关上它的文档站点是上面这样的 无惊无喜吧,组件库看起来还是蛮丰盛的。接着在比拟下Ant Design Blazor。 颜值党感觉拉不开差距,接着就看到了前几天公布的MASA Blazor。跟下面两个赫赫有名相比这个名气绝对小了一些。不过人不可貌相海水不可瓢崴,这个官网首页高大上了不少啊。心愿组件库别翻车。 尽管说组件库是列表展现没有平铺那么直观吧,然而这几个示例做的也难看太多了。 既然难看就连忙趁热再多理解一下,关上源码他们也是有疾速创立我的项目模板的。这里我就间接把官网的应用介绍拿来用了。 依照模板生成进去的是这个样子的,我集体是十分喜爱这种设计格调的,感觉能够省不少事。 应用MASA Blazor做个后盾治理页面1.输入框<MTextField @bind-Value="_options.Title" Label="题目"></MTextField> 这样就实现了一个输入框并且绑定了_options.Title这个对象。查看了官网文档并且进入了官网的交换区,发现了还有更实用的技巧。应用onEnter及onSearch就能够实现回车触发检索条件了,相当于JS的onkeydown事件。 <PPageHeader Title="搜寻" ShowFiltersByDefault OnSearch="() => FetchList()">    <Filters Context="filter">        <MRow Dense>            <MCol Cols="12" Sm="6" Md="4">     <MTextFieldLabel="题目"                    @bind-Value="_options.Title"                    Dense                     HideDetails="auto"                     Outlined                     Clearable     OnKeyDown="filter.onEnter"     OnClearClick="filter.onSearch">      </MTextField>     </MCol>     </MRow>    </Filters></PPageHeader>2.下拉框<MSelect Label="状态"          Dense         HideDetails="auto"         Outlined         Clearable     MenuProps="(props) => props.OffsetY = true"         Items="Enum<StateTypes>.GetEnumObjectList<StateTypes>()" ItemText="item => item.Name" ItemValue="item => item.Value" @bind-Value="_options.State" TItem="EnumObject<StateTypes>" TValue="StateTypes?" TItemValue="StateTypes" OnSelectedItemUpdate="filter.onSearch" OnClearClick="filter.onSearch"></MSelect>这样就能够实现把枚举StateTypes间接转成下拉菜单展现了。 3.日期选择器<PDateTimePicker Label="公布开始工夫"                 Clearable                 Dense                 DefaultSelectedValue="DateTime.UtcNow"                 HideDetails="auto"                 Outlined                 Format="yyyy-MM-dd HH:mm:ss"                 @bind-Value="_options.ReleaseStartTime" OnOk="filter.onSearch" OnClearClick="filter.onSearch"></PDateTimePicker> 4.数据表格        数据表格这里应用的时候遇到了一个小问题。就是分页的数量。从官网的示例中能够看到这里是反对全副获取的,但实在的场景这种状况必定是要躲避的。看了官网博客应用MASA.Blazor写一个规范的查问表格页 - MASA Blogs也没有找到好的答案。 ...

March 31, 2022 · 2 min · jiezi

关于c#:体验了一把最近很火的开源项目MASA-Blazor

前言很羞愧直到去年底才接触到Blazor。那什么是Blazor呢?置信大家都看过官网文档的具体阐明,另外MASA团队也有不错的阐明介绍 。用官网的话说Blazor是一个交互式客户端Web UI的框架,并且应用C#开发而不是JavaScript。好了言归正传,事件的起因是这样的,公司组织外部比赛须要用Blazor做一个简略的网页。为了能够更好的做出成果就简略的尝试了几个开源组件。 开源组件抉择遇事不决先找官网Blazor 教程,跟着微软的教程会失去上面这个样子的页面。 嗯,还是挺清爽的...预计会被领导喷死吧。既然官网提供的款式太清爽。那就要想一下怎么弯道超车了。 于是乎开始网上冲浪,首先想到的是Bootstrap Blazor组件库,也没有什么特地的起因可能只是因为以前常常用它写后盾页面吧。关上它的文档站点是上面这样的 无惊无喜吧,组件库看起来还是蛮丰盛的。接着在比拟下Ant Design Blazor。 颜值党感觉拉不开差距,接着就看到了前几天公布的MASA Blazor。跟下面两个赫赫有名相比这个名气绝对小了一些。不过人不可貌相海水不可瓢崴,这个官网首页高大上了不少啊。心愿组件库别翻车。 尽管说组件库是列表展现没有平铺那么直观吧,然而这几个示例做的也难看太多了。 既然难看就连忙趁热再多理解一下,关上源码他们也是有疾速创立我的项目模板的。这里我就间接把官网的应用介绍拿来用了。 依照模板生成进去的是这个样子的,我集体是十分喜爱这种设计格调的,感觉能够省不少事。 应用MASA Blazor做个后盾治理页面1.输入框<MTextField @bind-Value="_options.Title" Label="题目"></MTextField> 这样就实现了一个输入框并且绑定了_options.Title这个对象。查看了官网文档并且进入了官网的交换区,发现了还有更实用的技巧。应用onEnter及onSearch就能够实现回车触发检索条件了,相当于JS的onkeydown事件。 <PPageHeader Title="搜寻" ShowFiltersByDefault OnSearch="() => FetchList()">    <Filters Context="filter">        <MRow Dense>            <MCol Cols="12" Sm="6" Md="4">     <MTextFieldLabel="题目"                    @bind-Value="_options.Title"                    Dense                     HideDetails="auto"                     Outlined                     Clearable     OnKeyDown="filter.onEnter"     OnClearClick="filter.onSearch">      </MTextField>     </MCol>     </MRow>    </Filters></PPageHeader>2.下拉框<MSelect Label="状态"          Dense         HideDetails="auto"         Outlined         Clearable     MenuProps="(props) => props.OffsetY = true"         Items="Enum<StateTypes>.GetEnumObjectList<StateTypes>()" ItemText="item => item.Name" ItemValue="item => item.Value" @bind-Value="_options.State" TItem="EnumObject<StateTypes>" TValue="StateTypes?" TItemValue="StateTypes" OnSelectedItemUpdate="filter.onSearch" OnClearClick="filter.onSearch"></MSelect>这样就能够实现把枚举StateTypes间接转成下拉菜单展现了。 3.日期选择器<PDateTimePicker Label="公布开始工夫"                 Clearable                 Dense                 DefaultSelectedValue="DateTime.UtcNow"                 HideDetails="auto"                 Outlined                 Format="yyyy-MM-dd HH:mm:ss"                 @bind-Value="_options.ReleaseStartTime" OnOk="filter.onSearch" OnClearClick="filter.onSearch"></PDateTimePicker> 4.数据表格数据表格这里应用的时候遇到了一个小问题。就是分页的数量。从官网的示例中能够看到这里是反对全副获取的,但实在的场景这种状况必定是要躲避的。看了官网博客应用MASA.Blazor写一个规范的查问表格页 - MASA Blogs也没有找到好的答案。 ...

March 30, 2022 · 2 min · jiezi

关于c#:C-多线程

线程被定义为程序的执行门路。每个线程都定义了一个独特的控制流。如果您的应用程序波及到简单的和耗时的操作,那么设置不同的线程执行门路往往是无益的,每个线程执行特定的工作。 线程是轻量级过程。一个应用线程的常见实例是古代操作系统中并行编程的实现。应用线程节俭了 CPU 周期的节约,同时进步了应用程序的效率。 到目前为止咱们编写的程序是一个单线程作为应用程序的运行实例的繁多的过程运行的。然而,这样子应用程序同时只能执行一个工作。为了同时执行多个工作,它能够被划分为更小的线程。 线程生命周期线程生命周期开始于 System.Threading.Thread 类的对象被创立时,完结于线程被终止或实现执行时。 上面列出了线程生命周期中的各种状态: 未启动状态:当线程实例被创立但 Start 办法未被调用时的情况。就绪状态:当线程筹备好运行并期待 CPU 周期时的情况。不可运行状态:上面的几种状况下线程是不可运行的:曾经调用 Sleep 办法曾经调用 Wait 办法通过 I/O 操作阻塞死亡状态:当线程已实现执行或已停止时的情况。主线程在 C# 中,System.Threading.Thread 类用于线程的工作。它容许创立并拜访多线程应用程序中的单个线程。过程中第一个被执行的线程称为主线程。 当 C# 程序开始执行时,主线程主动创立。应用 Thread 类创立的线程被主线程的子线程调用。您能够应用 Thread 类的 CurrentThread 属性拜访线程。 上面的程序演示了主线程的执行: 实例using System;using System.Threading; namespace MultithreadingApplication{ class MainThreadProgram{ static void Main(string[] args) { Thread th = Thread.CurrentThread; th.Name = "MainThread"; Console.WriteLine("This is {0}", th.Name); Console.ReadKey(); }}}当下面的代码被编译和执行时,它会产生下列后果: This is MainThread

March 29, 2022 · 1 min · jiezi

关于c#:LeetCode-C4寻找两个正序数组的中位数

开发工具与关键技术: C#作者:奶糖不甜撰写工夫:2022.2.27C#是微软公司公布的一种由C和C++衍生进去的面向对象的编程语言、运行于.NET Framework和.NET Core之上的高级程序设计语言.并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成绩.C#看起来与Java有着惊人的类似;它包含了诸如繁多继承、接口、与Java简直同样的语法和编译成中间代码再运行的过程.然而C#与Java有着显著的不同,它借鉴了Delphi的一个特点,与COM是间接集成的,而且它是微软公司 .NET windows网络框架的配角.题目形容:给定两个大小别离为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的工夫复杂度应该为 O(log (m+n)) 。 示例:输出:nums1 = [1,2], nums2 = [3,4]输入:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 合并排序解法:先将两个数组num1和num2合并为同一数组,如何将其进行排序。用除法返回中位数的下标地位,进行输入。 public class Solution { public double FindMedianSortedArrays(int[] nums1, int[] nums2) { List<int> list = new List<int>(nums1); list.AddRange(nums2); list.Sort(); int n = nums1.Length; int m = nums2.Length; int len = n + m; var r = len / 2; if(len % 2 == 0){ return (list[r - 1] + list[r]) / 2.0; } else if(len % 2 != 0){ return list[r]; } else{ return 0; } throw new System.Exception("Failure"); }}注:先将数组注入表List当中函数List.AddRange()为将注入合并另一表函数List.Sort()为将list表进行排序 ...

March 28, 2022 · 1 min · jiezi

关于c#:C速成指南从入门到进阶实战WPF与Unity3D开发吾爱

下栽地止:https://lexuecode.com/4375.htmlC#基础知识根底语法你如果后期学习过C语言的话,那么学习C#基础知识就会感觉很容易,特地好了解。在这个环节你须要认真学习基础知识,你得学会在保障语法不报错的状况下,利用基础知识写一些简略的算法;得纯熟理解语法,应用切当并能够实现一些逻辑代码。 (根底语法、数据类型、变量、循环、办法、数组、汇合、判断、类等) 面向对象开发C语言是面向过程的开发语言,而C#是面对对象的开发语言,在应用C语言写逻辑代码时都是能够依照肯定的顺利逻辑将其实现就OK,而C#就不一样,你在学习语法,实现业务逻辑时得思考程序的可扩展性,鲁棒性等。 你得领有抽象思维,能够将事实中无生命体征的物品进行拟物解决,将它们进行更为形象的提炼,汇总为某个非凡类,让其这个类代表这类物品,并让其领有这个物品的所有属性和行为,这就是面向对象开发。 (继承、封装、多态、接口、抽象类等) 这一部分的学习比拟形象,学会领有抽象思维,让本人能够更好的了解这些知识点。 基础知识进阶这里你将会学习一些高端的编程玩法,可能短期内,你无奈应用到,然而它们更多体现在你的职业前期,当你理论应用框架或者浏览源码的过程中,都会遇到这些知识点,并有可能被它困住。 C#速成指南:从入门到进阶,实战WPF与Unity3D开发集成开发环境Visual Studio 构造using System;蕴含 System 命名空间 class hello{ /正文/ static void Main(string\[\] args){ //一个文件一个main函数}}构造体struct Books{变量...}构造不反对继承。构造不能申明默认的构造函数 枚举enum Day { Sun, Mon, tue, Wed, thu, Fri, Sat };Day.Sun==0 Day.Mon==1 接口public interface PaintCost {int getCost(int area);}派生类class Rectangle : hello, PaintCost{}全析namespace first{命名空间申明 public class Test{能够多个class构造函数、析构函数、动态成员... 变量... decimal a=10;128 位准确的十进制值,28-29 有效位数 sbyte b=2;8 位有符号整数类型 uint c;32 位无符号整数类型 ulong d;64 位无符号整数类型 ushort e;16 位无符号整数类型 ...

March 27, 2022 · 3 min · jiezi

关于c#:C速成指南从入门到进阶实战WPF与Unity3D开发吾爱fen享

C#学习路线指南下哉课程ZY: https://www.97yrbl.com/t-1374...题记最近本人始终在想,一个初学者刚开始应该学些什么,该学习到哪种水平找工作才不成问题,能力在做我的项目时熟能生巧不被Bug所困住。 破费了几天工夫整顿了C#学习路线图,能够说是纯家养C#程序员成长路线布局,在这里分享下,心愿能够帮忙到想从事C#开发的同学们。自己经历尚浅,有些知识点可能分享不正确,心愿宽广网友评论区补充,我会同步修改更新。是不是每一个初学者在刚开始学习任何一门编程语言的时候,都会有这样的疑难,都感觉无从下手,没有脉络。反正我过后的确有这样的困惑,在刚开始接触编程的时候,过后幸好有实验室学长和老师的倡议,才缩小了试错老本,能够把更多工夫都破费在正确的事件上,学习效率才会高。 依据我过后的学习状况和当初目前市场上的行情来剖析,列举出新手学习C#编程语言路线指南,心愿对你有帮忙。计算机根底 如果你是本科生的话,在校期间,应该会学习计算机根底,C语言,计算机组成原理,操作系统等对于计算机的课程,我心愿你好好学习,尤其是C语言,它是一种特地容易入门上手和理解编程思维的语言,是面向过程式的开发,首先你得学会应用它的语法做一些简略的逻辑运算,其次能够依据肯定的需要,实现局部非凡算法的演练(这些对你前期学习面向对象开发语言有很大的帮忙)。如果没有开设这些课程,那么就须要你花工夫去互联网上找相干视频去学习。 C#基础知识根底语法你如果后期学习过C语言的话,那么学习C#基础知识就会感觉很容易,特地好了解。在这个环节你须要认真学习基础知识,你得学会在保障语法不报错的状况下,利用基础知识写一些简略的算法;得纯熟理解语法,应用切当并能够实现一些逻辑代码。 (根底语法、数据类型、变量、循环、办法、数组、汇合、判断、类等) 面向对象开发C语言是面向过程的开发语言,而C#是面对对象的开发语言,在应用C语言写逻辑代码时都是能够依照肯定的顺利逻辑将其实现就OK,而C#就不一样,你在学习语法,实现业务逻辑时得思考程序的可扩展性,鲁棒性等。 你得领有抽象思维,能够将事实中无生命体征的物品进行拟物解决,将它们进行更为形象的提炼,汇总为某个非凡类,让其这个类代表这类物品,并让其领有这个物品的所有属性和行为,这就是面向对象开发。 (继承、封装、多态、接口、抽象类等) 这一部分的学习比拟形象,学会领有抽象思维,让本人能够更好的了解这些知识点。 基础知识进阶这里你将会学习一些高端的编程玩法,可能短期内,你无奈应用到,然而它们更多体现在你的职业前期,当你理论应用框架或者浏览源码的过程中,都会遇到这些知识点,并有可能被它困住。 (Linq、泛型、委托、事件、多线程、Socket开发)

March 26, 2022 · 1 min · jiezi

关于c#:MASA-Blazor入门这一篇就够了

1.什么是Blazor? 有什么劣势?ASP.NET Core Blazor 简介 Blazor 是一个应用 Blazor 生成交互式客户端 Web UI 的框架: 应用 C# 代替 JavaScript 来创立信息丰盛的交互式 UI。共享应用 .NET 编写的服务器端和客户端应用逻辑。将 UI 出现为 HTML 和 CSS,以反对泛滥浏览器,其中包含挪动浏览器。与旧式托管平台(如 Docker)集成。Blazor 劣势: 1. 应用 C# 代替 JavaScript 来编写代码。 2. 利用现有的 .NET 库生态系统。 3. 在服务器和客户端之间共享应用逻辑。 4. 受害于 .NET 的性能、可靠性和安全性。 5. 在 Windows、Linux 和 macOS 上应用 Visual Studio 放弃高效工作。 6. 以一组稳固、功能丰富且易用的通用语言、框架和工具为根底来进行生成。2.为什么抉择MASA Blazor?能用来干什么?MASA Blazor是一个基于 Blazor Component 和 Material Design 的 UI 组件库。 dotNET开发者不须要懂得javascript就能开发一个企业级中后盾零碎。 MASA Blazor劣势: 丰盛组件:蕴含Vuetify 1:1还原的根底组件,以及很多实用的预置组件和.Net深度集成性能,包含Url、面包 屑、导航三联动,高级搜寻,i18n等。UI设计语言:设计格调古代,UI 多端体验设计优良。繁难上手:丰盛具体的上手文档,收费的视频教程(制作中)。社区沉闷激励:用户参加实时互动,做出奉献退出咱们,构建最凋谢的开源社区。长期反对:全职团队保护,并提供企业级反对。业余示例:MASA Blazor Pro提供多种常见场景的预设布局。MASA Blazor Pro预设布局示例: ...

March 22, 2022 · 2 min · jiezi

关于c#:3-堪比JMeter的Net压测工具-Crank-进阶篇-认识bombardier

1. 前言通过之前的学习,咱们曾经理解了各参数以及配置的意义,接下来的文章咱们别离从bombardier以及wrk动手,进一步理解彼此之间的分割 2. 意识 bombardierbombardier 是一个 HTTP(S) 基准测试工具。它是用 Go 编程语言编写的,并应用优良的fasthttp代替 Go 的默认 http 库,因为它具备闪电般的疾速性能,具体文档查看 其反对参数: -c, --connections=125 Maximum number of concurrent connections-t, --timeout=2s Socket/request timeout-l, --latencies Print latency statistics-m, --method=GET Request method-b, --body="" Request body-f, --body-file="" File to use as request body-s, --stream Specify whether to stream body using chunked transfer encoding or to serve it from memory --cert="" Path to the client's TLS Certificate --key="" Path to the client's TLS Certificate Private Key-k, --insecure Controls whether a client verifies the server's certificate chain and host name-H, --header="K: V" ... HTTP headers to use(can be repeated)-n, --requests=[pos. int.] Number of requests-d, --duration=10s Duration of test-r, --rate=[pos. int.] Rate limit in requests per second --fasthttp Use fasthttp client --http1 Use net/http client with forced HTTP/1.x --http2 Use net/http client with enabled HTTP/2.0-p, --print=<spec> Specifies what to output. Comma-separated list of values 'intro' (short: 'i'), 'progress' (short: 'p'), 'result' (short: 'r'). Examples: * i,p,r (prints everything) * intro,result (intro & result) * r (result only) * result (same as above)-q, --no-print Don't output anything-o, --format=<spec> Which format to use to output the result. <spec> is either a name (or its shorthand) of some format understood by bombardier or a path to the user-defined template, which uses Go's text/template syntax, prefixed with 'path:' string (without single quotes), i.e. "path:/some/path/to/your.template" or "path:C:\some\path\to\your.template" in case of Windows. Formats understood by bombardier are: * plain-text (short: pt) * json (short: j)并且bombardier反对多平台,能够在Windows、Linux、OSX零碎上运行,那接下来咱们应用bombardier测试一下百度的压测状况 ...

March 21, 2022 · 3 min · jiezi

关于c#:基于NET的在线刷题考试系统源代码

分享一个基于.NET的在线刷题考试零碎,有残缺的源代码和脚本文件,能够做二次开发,有管理员,老师和学生三种角色,老师后盾能够批量上传试题,公布试卷,批改试卷,统计导出问题等 性能很全面,除了在线刷题和考试,还有其余性能,我在这里简略说一下,具体的能够下载钻研哦 1、在线刷题:试题能够批量导入导出,学员能够随时随地刷题2、在线考试:多种考试模式,主观题主动阅卷,主观题人工阅卷3、视频点播:能够上传录播课程,增加课件等4、在线直播:对接七牛云直播接口,非常晦涩5、实时督学:批量治理学员,对学员的学习进度无效统计,后盾可查6、在线领取:支付宝,微信在线购买课程,主动开课 运行环境:服务器操作系统:windows server 2012 64位中文版数据库:Microsoft SQL Server 2008.NET版本:.NET4.6 开发文档https://pan.baidu.com/s/1koQyvnb0YEutlQomjAwIjg 提取码:xekq源码下载https://gitee.com/weishakeji/LearningSystem 装置问题技术支持483828432留神:零碎装置后用记事本关上db.config文件里配置以下主域用域名拜访:例如拜访域名是:www.weisha100.net,主域处填写:weisha100.net,示例如下:add name="weisha100.net" 内网以及应用ip拜访:间接填写ip地址,示例如下:add name="122.114.68.70"留神:不须要带端口号。

March 18, 2022 · 1 min · jiezi

关于c#:LeetCode-C3无重复字符的最长子串

开发工具与关键技术: C#作者:奶糖不甜撰写工夫:2022.3.17C#是微软公司公布的一种由C和C++衍生进去的面向对象的编程语言、运行于.NET Framework和.NET Core之上的高级程序设计语言.并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成绩.C#看起来与Java有着惊人的类似;它包含了诸如繁多继承、接口、与Java简直同样的语法和编译成中间代码再运行的过程.然而C#与Java有着显著的不同,它借鉴了Delphi的一个特点,与COM是间接集成的,而且它是微软公司 .NET windows网络框架的配角.题目形容:给定一个字符串 s ,请你找出其中不含有反复字符的最长子串的长度. 示例:输出: s = "abcabcbb"输入: 3 解释: 因为无反复字符的最长子串是 "abc",所以其长度为 3. 哈希表滑动窗口解法:利用滑动Hash联合窗口,设置left(左)指针和right(右)指针来进行窗口保护,通过right指针下标右移,遍历字符串中不含有反复字符的最长子串的长度.当发现反复字符时,将已知的最长不反复字符串存入Hash中,批改left指针下标,进行新一轮遍历.最初,将Hash中的所有后果进行比照判断出最长子串的长度,并返回. public class Solution { public int LengthOfLongestSubstring(string s) { if (s.Length < 2) return s.Length; //如果字符串长度小于2,也就是为1或null时,返回自身长度即可. var l = 0;//定义left指针 var r = 0;//定义right指针 var maxlen = 0;//定义后果maxlen var charSet = new HashSet<char>();//定义哈希表charSet while (r < s.Length) { //在right指针值大于长度条件未达成之前有限循环 if (charSet.Contains(s[r]) == false) { //当后果不等,right指针自增后重新加入charSet哈希表 charSet.Add(s[r++]); maxlen = Math.Max(maxlen, r - l);//计算结果 } else { charSet.Remove(s[l++]);//否则状况下,left指针自增 } }//后果maxlen匹配是跳出循环,return后果 return maxlen; }}注: 为何开始判断字符串长度的条件是s.Length < 2,而不是s.Length <= 2?因为如果字符串两个都雷同时,它须要返回的后果也仅为1,没必要额定削减运算. ...

March 17, 2022 · 1 min · jiezi

关于c#:LeetCode题库-C2两数相加

开发工具与关键技术: C#作者:奶糖不甜撰写工夫:2022.3.7 C#是微软公司公布的一种由C和C++衍生进去的面向对象的编程语言、运行于.NET Framework和.NET Core之上的高级程序设计语言.并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成绩.C#看起来与Java有着惊人的类似;它包含了诸如繁多继承、接口、与Java简直同样的语法和编译成中间代码再运行的过程.然而C#与Java有着显著的不同,它借鉴了Delphi的一个特点,与COM是间接集成的,而且它是微软公司 .NET windows网络框架的配角.题目形容:给你两个非空的链表,示意两个非负的整数.它们每位数字都是依照逆序的形式存储的,并且每个节点只能存储 一位数字.请你将两个数相加,并以雷同模式返回一个示意和的链表.你能够假如除了数字 0 之外,这两个数都不会以 0 结尾,每个链表中的节点数都在范畴[1, 100]之内. 示例:输出l1 = [2, 4, 3], l2 = [5, 6, 4].后果输入为[7, 0, 8].解释:342 + 465 = 807. 最清晰解法:链表的计算方法,首先想到的就是进位,设置进位值.因为题目表明链表是逆序相加,所以第一位也就是个位数先进行计算,更加不便确定是否有进位值。 设置进位值num,将每次l1, l2, num三个值加起来为mid,位数为mid%10,大于10则进位为mid/10,实例如下: public class Solution { public ListNode AddTwoNumbers(ListNode l1, ListNode l2, int num = 0) { if(l1 == null && l2 == null) { if(num != 0) return new ListNode(num); else return null; } int mid = (l1?.val ?? 0) + (l2?.val ?? 0) + num; ListNode listnode = new ListNode(mid % 10); listnode.next = AddTwoNumbers(l1?.next, l2?.next, mid/10); return listnode; }}注:解说一下问号的用法. ...

March 16, 2022 · 1 min · jiezi

关于c#:C速成指南从入门到进阶实战WPF与Unity3D开发

download:C#速成指南:从入门到进阶,实战WPF与Unity3D开发在 Web 應用程序開發方面,Vue.js 正快速成爲開發人員的最愛。這個現代、新穎的 JavaScript 庫它在 GitHub 上有超过 123,000 颗星,關於開發人員來說是一個引人瞩目的選择,由於它很容易集成到現有項目中。它的速度很快,它非常強大。妳能夠用它從頭開端樹立一個動態的、可擴展的、可維護的單頁面應用程序。 作爲一個 JavaScript 框架,Vue.js 允許您輕鬆地將動態數據渲染到 DOM,將數據绑定到 DOM 元素,以及治理/維護應用程序的狀態(本地存儲),而無需用戶从新加载阅讀器。它是首選,由於它是輕量級的,模塊化的,需要起码的配置。它的速度也非常快,文件大小也很低。開發人員能夠很容易地把它放入任何項目或現有的框架中。 隨著Vue.js逐渐成爲更多開發者的首選框架,這里有8個值得關注的UI組件,心愿能在2019年整合到妳的項目中。在每個組件的开端,我都增加了該組件GitHub倉庫账戶的链接,以讓妳能夠做出奉獻。

March 16, 2022 · 1 min · jiezi

关于c#:COMP1038银行系统

COMP1038 Coursework 02 – Digital MiniBanking SystemIntroductionThis is the COMP1038 Coursework 02. It is worth 40% of the module mark. Thedeadline for this exercise is 16:00 on Saturday 26th of December 2020.Read the entire document before beginning the exercise.If you have any questions about this exercise, please ask in the Q&A forum onMoodle, after a lecture, in a lab, or during the advertised office hours. Do not postyour program or parts of your program to Moodle as you are not allowed to share yourcoursework programs with other students. If any questions require this exercise to beclarified then this document will be updated and everyone will be notified via Moodle.Version History Version 2.0 - 2020-12-04 – version 2.SubmissionYou must submit a single C source code file containing all your code for this exerciseand a text file containing city names, branch names, and their codes. The files must becalled DigitalMiniBank_<Your_Name>_<Your Numeric Id>.c andCityBranchCodes_<Your_Name>_<Your Numeric Id>.txt. The program must notrequires any other files outside of the standard C headers which are always available.The first line of the C source code file should be a comment which contains yourstudent ID number, username, and full name, of the form:// 6512345 zy12345 Joe BlogsThe file must compile without warnings or errors when I use the commandgcc -std=c99 -lm -Wall DigitalMiniBank_<Your_Name>_<Your Numeric Id>.c -oMiniBankAccountThis command will be run on our Linux server cslinux. If it does not compile, for anyreason, then you will lose all the marks for testing (common reasons in the past havebeen submitting a file with the wrong filename, or developing your solution on yourpersonal computer without having tested it on our Linux server). If the file compilesbut has warnings then you will lose some marks for not correcting the warnings.The completed source code file should be uploaded to the Coursework Submissionlink on the COMP1038 Moodle page. You may submit as many times as you wishbefore the deadline (the last submission before the deadline will be used). After thedeadline has passed, if you have already submitted your exercise then you will not beable to submit again. If you have not already submitted then you will be allowed tosubmit once.Late submissions: Late submissions will lose 2 percentage points per hour, roundedup to the next whole hour. This is to better represent the large benefit a small amountof extra time can give at the end of a programming exercise. No late submissions willbe accepted more than 50 hours after the exercise deadline. If you have extenuatingcircumstances you should file them before the deadline.PlagiarismYou should complete this coursework on your own. Anyone suspected of plagiarismwill be investigated and punished in accordance with the university policy onplagiarism (see your student handbook and the University Quality Manual). This mayinclude a mark of zero for this coursework.You should write the source code required for this assignment yourself. If you usecode from other sources (books, web pages, etc), you should use comments toacknowledge this (and marks will be heavily adjusted down accordingly). The onlyexception to this is the dynamic data-structures (linked lists and others) developedduring the lectures and tutorials; you may use these, with or without modification,without penalty as long as you add a comment in your program saying you have takenthem from the lectures or tutorials and saying how you have modified it (or notmodified it). If you do not acknowledge their source in a comment then it will beregarded as potential plagiarism.You must not copy or share source code with other students. You must not worktogether on your solution. You can informally talk about higher-level ideas but not toa level of detail that would allow you all to create the same source code.Remember, it is quite easy for experienced lecturers to spot plagiarism in source code.We also have automated tools that can help us identify shared code, even withmodifications designed to hide copying. If you are having problems you should askquestions rather than plagiarize. If you are not able to complete the exercise then youshould still submit your incomplete program as that will still get you some of themarks for the parts you have done (but make sure your incomplete solution compilesand partially runs!).If I have concerns about a submission, I may ask you to come to my office andexplain your work in your own words.MarkingThe marking scheme will be as follows: Tests (60%): Your program should correctly implement the task requirements.A number of tests will be run against your program with different input datadesigned to test if this is the case for each individual requirement. The teststhemselves are secret but general examples of the tests might be:o Does the program work with the example I/O in the question?o Does the program work with typical valid input?o Does the program correctly deal with input around boundary values?o Does the program correctly deal with invalid input (both invalid files andvalues)?o Does the program handle errors with resources not being available (eg,malloc failing or a filename being wrong)?o Does the program output match the required format?o Does the program output an appropriate table when required?As noted in the submission section, if your program does not compile thenyou will lose all testing marks. Appropriate use of language features (30%): Your program should use theappropriate C language features in your solution. You can use any languagefeatures or techniques that you have seen in the course, or you have learned onyour own, as long as they are appropriate for your solution. Examples of thismight be:o If you have many similar values, are you using arrays (or equivalent)instead of many individual variables?o Have you broken your program down into separate functions?o Are all your function arguments being used?o If your functions return values, are they being used?o If you have complex data, are you using structures?o Are you using loops to avoid repeating many lines of code?o Are your if/switch statements making a difference, or are the conditionsalways true or false making the statement pointless?o Are you closing files when the file is no longer in use? Source code formatting (10%): Your program should be correctly formattedand easy to understand by a competent C programmer. This includes, but is not limited to, indentation, bracketing, variable/function naming, and use ofcomments.TaskNowadays, bank accounts have become an important part of human life for savingmoney easy and safe way. Due to the recent growth of digitization, most of the banksare maintaining the accounts of their customers on a computerized system. As abanking software developer, your task is to develop a computerized banking system.When the program runs, it should display the following main menu to the user andprompt them to enter a menu option:1) Show city code and branch code2) Open an account3) Show account details4) Show list of accounts5) Deposit in an account6) Withdraw from an account7) Transfer money8) Transaction details9) Close an account10)QuitOption:If the user enters the number of an option, the program should perform that optionthen return to the main menu to let the user select another option. If the user enterssomething which is not a valid option then the program should print "Unknownoption." then print "Option: " again for the user to select another option. The usermay enter any input at this, or any other prompt, in the program, terminated bypressing the return key (newline character). Your program must deal with thisappropriately, accepting valid input and rejecting invalid input according to theparticular prompt.If the user selects “Show city code and branch code”, then the program will show thelist of city and city codes, and a prompt “Enter the city code:”. When the userenters a city code from the list, it will display list of branches within that city and theircodes. For doing this, the students need to prepare a text file containing city namesand branch names and their codes. The file shoud contains at least 10 city names, 5branch name from each city, and their respective codes.If the user selects “Open an account”, then the program should ask the user to inputflowing data.Description Type Size RemarksName String 100 charactersId Number String 15 Characters Id can be alphanumericAddress String 200 CharactersDate of Birth String 10 Characters YYYY/MM/DDInitial deposit Integer not less than 1000 RMBAfter inputting these data of an account the account will be created and a numericaccount number will be assigned by the program in the format of xxxxxxxxxx. Thefirst xxx is the city code which is a number within 001-999 from the list of city codes,the second xx is the branch code which is a number within 01-99 from list of branchcodes, and the third xxxxx is the account number which is a number within 00001- ...

March 12, 2022 · 15 min · jiezi

关于c#:C语言预处理命令总结

预处理指令是以#号结尾的代码行,# 号必须是该行除了任何空白字符外的第一个字符。# 后是指令关键字,在关键字和 # 号之间容许存在任意个数的空白字符,整行语句形成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。 预处理指令: 预处理性能是C语言特有的性能,它是在对源程序正式编译前由预处理程序实现的,程序员在程序中用预处理命令来调用这些性能。 宏定义能够带有参数,宏调用时是以实参代换形参,而不是“值传送”。 为了防止宏代换时产生谬误,宏定义中的字符串应加括号,字符串中呈现的形式参数两边也应加括号。 文件蕴含是预处理的一个重要性能,它可用来把多个源文件连接成一个源文件进行编译,后果将生成一个指标文件。 条件编译容许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而缩小了内存的开销并进步了程序的效率。 应用预处理性能便于程序的批改、浏览、移植和调试,也便于实现模块化程序设计。

March 3, 2022 · 1 min · jiezi

关于c#:对C语言选择结构和循环结构的总结

C语言中罕用的编程构造有三种(其它编程语言也是如此),它们别离是: 程序构造:代码从前往后顺次执行,没有任何“旁敲侧击”,不跳过任何一条语句,所有的语句都会被执行到。 抉择构造:也叫分支构造。代码会被分成多个局部,程序会依据特定条件(某个表达式的运算后果)来判断到底执行哪一部分。 循环构造:程序会从新执行同一段代码,直到条件不再满足,或者遇到强行跳出语句(break 关键字)。 抉择构造 抉择构造(分支构造)波及到的关键字包含 if、else、switch、case、break,还有一个条件运算符? :(这是C语言中惟一的一个三目运算符)。其中,if...else 是最根本的构造,switch...case 和? :都是由 if...else 演变而来,它们都是为了让程序员书写更加不便。 你能够只应用 if,也能够 if...else 配对应用。另外要长于应用 switch...case 和? :,有时候它们看起来更加清新。 if...else 能够嵌套应用,原则上嵌套的档次(深度)没有限度,然而过多的嵌套档次会让代码构造凌乱。 循环构造 C语言中罕用的循环构造有 while 循环和 for 循环,它们都能够用来解决同一个问题,个别能够相互代替。 除了 while 和 for,C语言中还有一个 goto 语句,它也能形成循环构造。不过因为 goto 语句很容易造成代码凌乱,保护和浏览艰难,饱受诟病,不被举荐,而且 goto 循环齐全能够被其余循环取代,所以起初的很多编程语言都勾销了 goto 语句,咱们也不再解说。 对于 while 和 do-while 循环,循环体中应包含使循环趋于完结的语句。 对于 while 和 do-while 循环,循环变量的初始化操作应该在 while 和 do-while 语句之前实现,而 for 循环能够在外部实现循环变量的初始化。 for 循环是最罕用的循环,它的功能强大,个别都能够代替其余循环。 最初还要留神 break 和 continue 关键字用于循环构造时的区别:break 用来跳出所有循环,循环语句不再有执行的机会;continue 用来完结本次循环,间接跳到下一次循环,如果循环条件成立,还会持续循环。 此外,break 关键字还能够用于跳出 switch...case 语句。所谓“跳出”,是指一旦遇到 break,就不再执行 switch 中的任何语句,包含以后分支中的语句和其余分支中的语句;也就是说,整个 switch 执行完结了,接着会执行整个 switch 前面的代码。 ...

March 3, 2022 · 1 min · jiezi

关于c#:讨论下封装

C# 封装封装 被定义为"把一个或多个我的项目关闭在一个物理的或者逻辑的包中"。在面向对象程序设计方法论中,封装是为了避免对实现细节的拜访。 形象和封装是面向对象程序设计的相干个性。形象容许相干信息可视化,封装则使开发者实现所需级别的形象。 C# 封装依据具体的须要,设置使用者的拜访权限,并通过 拜访修饰符 来实现。 一个 拜访修饰符 定义了一个类成员的范畴和可见性。C# 反对的拜访修饰符如下所示: public:所有对象都能够拜访;private:对象自身在对象外部能够拜访;protected:只有该类对象及其子类对象能够拜访internal:同一个程序集的对象能够拜访;protected internal:拜访限于以后程序集或派生自蕴含类的类型。 Public 拜访修饰符Public 拜访修饰符容许一个类将其成员变量和成员函数裸露给其余的函数和对象。任何私有成员能够被内部的类拜访。 上面的实例阐明了这点: 实例using System; namespace RectangleApplication{ class Rectangle{ //成员变量 public double length; public double width; public double GetArea() { return length * width; } public void Display() { Console.WriteLine("长度: {0}", length); Console.WriteLine("宽度: {0}", width); Console.WriteLine("面积: {0}", GetArea()); }}// Rectangle 完结class ExecuteRectangle{ static void Main(string[] args) { Rectangle r = new Rectangle(); r.length = 4.5; r.width = 3.5; r.Display(); Console.ReadLine(); }}}当下面的代码被编译和执行时,它会产生下列后果: ...

February 26, 2022 · 1 min · jiezi

关于c#:你所不知道的-C-10新特性

咱们很快乐地发表 C# 10 作为 .NET 6 和 Visual Studio 2022 的一部分曾经公布了。在这篇文章中,咱们将介绍 C# 10 的许多新性能,这些性能使您的代码更丑陋、更具表现力和更快 . 浏览 Visual Studio 2022 布告 和 .NET 6 布告 以理解更多信息,包含如何装置。 全局和隐式usingsusing 指令简化了您应用命名空间的形式。 C# 10 包含一个新的全局 using 指令和隐式 usings,以缩小您须要在每个文件顶部指定的 usings 数量。 全局using指令如果关键字 global 呈现在 using 指令之前,则 using 实用于整个我的项目: global using System; 您能够在全局 using 指令中应用 using 的任何性能。 例如,增加动态导入类型并使该类型的成员和嵌套类型在整个我的项目中可用。 如果您在 using 指令中应用别名,该别名也会影响您的整个我的项目: global using static System.Console;global using Env = System.Environment;您能够将全局应用放在任何 .cs 文件中,包含 Program.cs 或专门命名的文件,如 globalusings.cs。 全局usings的范畴是以后编译,个别对应以后我的项目。 无关详细信息,请参阅 全局 using 指令。 ...

February 26, 2022 · 4 min · jiezi

关于c#:ASPNET与NET-Framework和C的关系

你好,是我琉忆。明天咱们讲一讲ASP.NET与.NET Framework和C#的关系。 在开始介绍ASP.NET之前,咱们须要先理解以下运行ASP.NET的开发平台.NET框架。如果你之前学过C#那么对.NET框架会有肯定的理解。当你在编写ASP.NET代码时会发现ASP.NET的代码和C#相近甚至等同。那么你肯定会有一些疑难。他们三者是什么关系呢?咱们一起来看看。 一、.NET Framework介绍Microsoft.net是2000年6月22日微软向全世界推出的,全新的软件开发和服务平台,目标是向全世界的客户提供弱小的、个性化的互联网服务。从2002年公布最后的版本1.0,到2012年正式推出4.5,共经验了1.0、1.1、2.0、3.0、3.5 、4.0、4.5、4.7八个版本。 .NET的外围就是.NET Framework(.Net框架)是.NET程序开发和运行的环境,在这个平台下能够用不同的语言进行开发,因为.NET是跨语言的一个平台。语言能够是C#,F#,Visual Basic.NET等等。JAVA和.NET不同的是java是跨平台的,不跨语言的。.NET跨平台仅限于安卓零碎和IOS苹果零碎。 1、.NET Framework蕴含以下两个次要组件: CLR:公共语言运行库(Common Language Runtime),提供外在治理,代码安全性检测等性能。 FLC:.NET框架类库(.NET Framework Class Library),提供大量利用类库,类库中有很线程的资源可应用(比方:类、办法、属性)提高效率。 它的底层构造如图:2、公共语言运行时(CLR) .NET Framework 的外围是其运行库的执行环境,称为公共语言运行时(CLR)或.NET运行库。通常将在CLR的管制下运行的代码称为托管代码。 CLR次要负责托管代码的编译和运行。在.NET中代码的编译分为两个阶段: (1)把源代码编译为Microsoft两头语言(MSIL Microsoft Intermediate Language)。 (2)CLR把MSIL编译为平台专用的机器代码。 3、CLR的构造 CLR的构造由以下三局部组成: ①CLS:公共语言标准,获取各种语言转换成对立的语法标准。 ②CTS:通用类型零碎,将各种语言中的数据类型转换成对立的类型 ③JIT:实时编译器(即时编译器)用于将转换之后的语言编译为二进制语言,交给CPU执行。 4、.NET框架类库(FCL) .NET框架类库提供了实现基本功能的类,例如输入输出、字符串的操作、网络通信等。 .NET Framework中,所有的命名空间都是从System的命名空间造成的。System命名空间又称为根命名空间。对应命名空间的作用如下图所示: 【如果你还没关注我的话,能够点点关注,每天更新文章我告诉你。】 二、C# 随着.NET 平台的诞生,微软推出了配合 .NET平台的利用程序开发语言——C#(C Sharp)。 学习C#语言,能开发什么样的程序呢?能够开发的程序如下图: C#是一个.NET平台下的一个编程设计语言,仅仅是一个语言。是运行在.NET CLR上的,用于创立应用程序的高级语言。程序设计语言是为了不便开发人员和计算机沟通工具。 C#.NET应用程序编译步骤如下: 1、应用C#语言编写利用程序代码; 2、把C#源程序编译为Microsoft两头语言(MSIL Microsoft Intermediate Language),以程序集的模式存在; 3、在执行代码时,必须应用JIT编译器将程序集编译老本机代码; 4、在托管的CLR环境下运行本机代码,程序执行结果显示进去; 三.ASP.NET ASP.NET 是微软 .NET 体系提供的 Web 开发框架,是网站开发的技术,是.NET框架中的一个利用模型,用于生成基于Web的应用程序的内容丰盛的编程框架。应用ASP.NET开发Web应用程序并维持其运行,比其余开发语言更加简略。与Java、PHP和Per等高级技术相比,ASP.NET具备方便性、灵活性、生产效率高、安全性高及面向对象等长处,是目前支流的网络编程技术之一。 ASP.NET 反对 3 种开发模式: 1、Web Pages ...

February 17, 2022 · 1 min · jiezi

关于c#:net-core下分表分库解决方案多租户

介绍本期配角:ShardingCore 一款ef-core下高性能、轻量级针对分表分库读写拆散的解决方案,具备零依赖、零学习老本、零业务代码入侵 dotnet下惟一一款全自动分表,多字段分表框架,领有高性能,零依赖、零学习老本、零业务代码入侵,并且反对读写拆散动静分表分库,同一种路由能够齐全自定义的新星组件,通过本框架你岂但能够学到很多分片的思维和技巧,并且更能学到Expression的奇思妙用 你的star和点赞是我坚持下去的最大能源,一起为.net生态提供更好的解决方案 我的项目地址github地址 https://github.com/xuejmnet/s...gitee地址 https://gitee.com/dotnetchina...背景因为之前有小伙伴在应用ShardingCore的时候问过我是否能够利用ShardingCore的分库性能实现多租户呢,我的答复是能够的,然而须要针对分库对象进行路由的编写,相当于我一个我的项目须要实现多租户所有的表都须要实现分库才能够,那么这个在理论利用中将是不切实际的,所以尽管分库能够用来进行多租户然而个别没人会真的这样操作,那么就没有方法在ShardingCore应用正当的多租户外加分表分库了吗,针对这个问题ShardingCore在新的版本x.4.x.x+中进行了实现 性能ShardingCorex.4.x.x+版本中具体实现了哪些性能呢 多配置反对,能够针对每个租户或者这个配置进行独自的分表分库读写拆散的链接配置多数据库配置,反对多配置下每个配置都能够领有本人的数据库来进行分表分库读写拆散动静多配置,反对动静增加多配置(目前不反对动静删减多配置,后续会反对如果有须要)场景假如咱们有这么一个多租户零碎,这个零碎在咱们创立好账号后会调配给咱们一个独自的数据库和对应的表信息,之后用户能够利用这个租户配置信息进行操作解决 首先咱们创立一个AspNetCore的我的项目这边才用的.Net6版本的webapi 增加依赖 这边咱们增加了三个包,别离是ShardingCore,Microsoft.EntityFrameworkCore.SqlServer,Pomelo.EntityFrameworkCore.MySql,其中ShardingCore用的是预览版的如果不勾选那么将无奈显示进去,为什么咱们须要增加额定的两个数据库驱动呢,起因是因为咱们须要在不同的租户下实现不同的数据库的配置,比方租户A和咱们签订的协定外面有阐明零碎应用开源数据库,或者心愿应用Linux平台那么能够针对租户A进行配置MySql或者PgSql,租户B是资深软粉说须要应用MSSQL那么就能够针对其配置MSSQL.个别状况下咱们可能不会呈现多数据库的状况然而为了关照到非凡状况咱们这边也针对这种状况进行了反对。 公共用户存储首先在我还没有创立租户的时候是不存在数据库的所以我的数据自然而然不会存在以后租户下,这边咱们采纳的是存储到其余数据库中,假如咱们应用一个公共的数据库作为用户零碎. 创立用户零碎创立零碎用户和创立零碎用户在数据库内的映射关系 public class SysUser { public string Id { get; set; } public string Name { get; set; } public string Password { get; set; } public DateTime CreationTime { get; set; } public bool IsDeleted { get; set; } } public class SysUserMap:IEntityTypeConfiguration<SysUser> { public void Configure(EntityTypeBuilder<SysUser> builder) { builder.HasKey(o => o.Id); builder.Property(o => o.Id).IsRequired().IsUnicode(false).HasMaxLength(50); builder.Property(o => o.Name).IsRequired().HasMaxLength(50); builder.Property(o => o.Password).IsRequired().IsUnicode(false).HasMaxLength(50); builder.HasQueryFilter(o => o.IsDeleted == false); builder.ToTable(nameof(SysUser)); } }创立这个数据库该有的配置信息表,便于前期启动后重建 ...

February 16, 2022 · 6 min · jiezi

关于c#:MASA-Framework-DDD设计1

DDD畛域驱动设计是一个无关软件开发的方法论,它提出基于畛域开发的开发模式,基于DDD实践,咱们能够设计出高质量的软件模型。 它围绕业务概念构建畛域模型来管制业务的复杂度,解决软件难以了解和演变的问题。 微服务微服务是一种架构格调,通过过程间通信、容错和故障隔离等形式,实现去中心化的服务治理。 DDD与微服务它们都是高内聚、低耦合,从业务视角拆散复杂度,进步响应能力。 高内聚:把相干的业务汇集在一起 低耦合:把关联性较低的拆分为独立的服务 应用DDD搭建微服务咱们将取得以下劣势: 设计清晰,标准基于畛域模型,有利于畛域常识的传递和传承帮忙团队建设良好的沟通帮助零碎架构的演进进步团队的设计能力(面向对象,架构)设计畛域设计波及技术与业务,如何让它们合作起来呢? 策略设计(业务)畛域、子域、限界上下文 将畛域拆分成子域,并划分外围子域、撑持子域和通用子域以子域开展事件风暴,依据上下文语义划分限界上下文,建设通用语言,实现领域建模领域建模将作为能力核心布局的重要依据实现能力核心地图和优先级后,作为微服务设计的输出实现战术设计战术设计(技术)聚合、聚合根、实体、值对象、畛域服务等 依照畛域模型实现微服务设计和落地建设聚合、聚合根、实体、值对象、畛域服务等对象之间的依赖关系,以代码对象的模式映射到服务中,采纳分层架构实现微服务设计和落地 分层架构能够采纳Clean ArchitectureDDD实际过程咱们将通过DDD + Clean Architecture实现业务与技术的残缺落地 对立语言(策略设计)对立: 畛域模型术语DDD模式名称技术: 技术设计术语技术术语技术设计模式业务: 畛域模型术语DDD模式名称业务术语设计无关的业务术语 事件风暴(策略设计)Event Storming是一种领域建模的实际,能够让畛域相干人员疾速了解业务模型 残缺流程包含如对立语言、提出畛域事件、规定、命令、读模型、角色、划分子域、票选、补充商机与价值等, 接下来咱们先精简一点步骤 流动筹备人:业务人员,领域专家,技术人员,架构师,测试等 看板:能够将事件流可视化的白板或者画图工具等 黑白贴纸:填写事件,命令等 业务场景规定业务场景,上面我以一个电商我的项目为例 事件风暴后果 命令风暴后果 寻找聚合聚合:一组相干畛域模型的汇合,尽量保障封装业务的不变性,确保关联关系严密的畛域模型内聚 按事件程序顺次剖析三个问题 事件扭转的畛域模型是什么畛域模型是否能够独立拜访,是就是聚合不能独立拜访,须要通过哪个畛域模型(聚合)来拜访,将其放到对应聚合内命令贴在聚合右边代表输出,事件贴到聚合左边代表输入测验是否合乎聚合规定,不匹配的从新调整聚合聚合后果寻找聚合过程中可能会因为业务连接产生新的输出命令,以虚线示意 划分限界上下文限界上下文:某个场景或环境下的业务边界 基于聚合和畛域模型,判断它们要解决的业务问题,如果是同一个问题则放到一个限界上下文中,否则就拆分如果一个聚合同时解决多个问题,则须要对聚合进行拆分,将拆分后的聚合划分到不同的限界上下文解决的业务问题大小(变动起因,外在逻辑等)需与领域专家共同完成限界上下文后果 界线上下文映射当上下文很多的时候,不同的团队负责不同的上下文,为了保障无效的工作能够定义不同的上下文之间的关系来创立一个所有模型上下文的全局视图。两个上下文之间是有方向的,上游(U或Upstream),上游(D或Downstream) 界线上下文映射后果 子域一个业务畛域或子域是一个业务范围。一个业务畛域或子域能够包含多个业务能力,一个业务能力对应一个服务。 外围子域指业务胜利的次要促成因素,是企业的外围竞争力。 通用子域被整个业务零碎应用。 撑持子域是实现业务的必要能力,但不是胜利的因素。 除了下面限界上下文后果中标注的子域外,还能够扩大出财务,市场,洽购等子域畛域对象关系(战术设计)合成聚合,提取该聚合蕴含的畛域对象 畛域对象的业务不变性畛域对象具备统一的生命周期 定义实体与值对象(战术设计)实体:存在唯一性标识,实体间是否相等的判断根据也是惟一标识 值对象:示意属性的不变值 以订单聚合为例: 订单聚合蕴含订单实体,订单行实体订单实体蕴含收货地址值对象架构设计咱们简略的把架构设计看作是三个层面: 业务架构:依据业务需要设计业务模块及其关系 DDD的领域建模其实就曾经帮助咱们做了业务架构和零碎架构零碎架构:设计零碎与子系统的模块及其关系 在DDD中业务架构是能够间接映射到零碎架构上的 业务变动会演变为零碎架构变动,影响到技术架构变动 技术架构:设计技术和框架细节 技术架构(微服务)则解决子系统之间的解耦,去中心化的服务治理和数据治理Clean Architecture寻找聚合时咱们提到过输出和输入。而Clean Architecture与DDD汇合后就非常适合作为采纳DDD方法论的架构落地领导 为了更好的落地读模型设计(查问业务比拟往往占八成以上),搭配CQRS可能是个不错的抉择。 CQRS劣势在于职责拆散,进步零碎性能、可扩展性、安全性等。也能够从数据驱动转为事件驱动。 要理解CQRS能够看第二篇 MASA Framework - EventBus设计 示例能够参考MASA EShop源码:https://github.com/masalabs/M... 除了DDD以外,咱们还提供了EventBus、Dapr、CQRS等多种实现形式 老零碎演进绞杀者模式在现有零碎外围将新性能用新的形式构建为新的服务的策略,通过将新性能做成微服务形式,而不是间接批改原有零碎,逐渐的实现对老零碎替换。采纳这种策略,随着工夫的推移,新的服务就会逐步“绞杀”老的零碎。对于那些规模很大而又难以对现有架构进行批改的遗留零碎,举荐采纳绞杀者模式。 毛病:可能须要一段时间同时保护两个或以上的我的项目修理模式修理者模式就如修房或修路一样,将老旧待修理的局部进行隔离,用新的形式对其进行独自修复。修复的同时,需保障与其余局部仍能协同性能。从这种思路登程,修理者模式更多体现为一种重构技术。 DDD实际流程 ...

February 16, 2022 · 1 min · jiezi

关于c#:CVBNET向PDF文档添加文本水印

水印是呈现在文档中现有内容后面或前面的文本或图像。它通常用于避免文档被非法应用。在下文中,我将介绍如何应用Spire.PDF for .NET在C#和VB.NET程序中向PDF增加单行或多行文本水印。 • 增加单行文本水印到PDF• 增加多行文本水印到PDF 装置Spire.PDF首先,你须要从这个链接下载Spire.PDF的最新版本,并手动将DLL文件增加到你的应用程序中作为援用。或者,你能够通过NuGet间接装置它。示例1 增加单行文本水印到PDF[C#] using Spire.Pdf;using Spire.Pdf.Graphics;using System.Drawing; namespace AddTextWatermarkToPdf{ class Program { static void Main(string[] args) { //创立一个PdfDocument 对象 PdfDocument pdf = new PdfDocument(); //加载一个示例PDF文档 pdf.LoadFromFile(@"C:\Users\Administrator\Desktop\sample.pdf"); //创立一个PdfTrueTypeFont 对象 PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial", 55f), true); //设置水印文本 string text = "Internal Use"; //测量文本大小 SizeF textSize = font.MeasureString(text); //计算两个偏移变量的值,用于计算坐标系的平移量float offset1 = (float)(textSize.Width * System.Math.Sqrt(2) / 4); float offset2 = (float)(textSize.Height * System.Math.Sqrt(2) / 4); //遍历文档中的所有页面 foreach (PdfPageBase page in pdf.Pages) { //设置页面透明度 page.Canvas.SetTransparency(0.8f); //将坐标系平移到右下角 page.Canvas.TranslateTransform(page.Canvas.Size.Width / 2 - offset1 - offset2, page.Canvas.Size.Height / 2 + offset1 - offset2); //将坐标系逆时针旋转45度 page.Canvas.RotateTransform(-45); //在页面上绘制水印文本 page.Canvas.DrawString(text, font, PdfBrushes.DarkGray, 0, 0); } //将更改保留到另一个文件 pdf.SaveToFile("TextWatermark.pdf"); } }}[VB.NET] ...

February 8, 2022 · 3 min · jiezi

关于c#:C-官方文档导读及推荐书单

本文次要是心愿帮忙想学习 C# 和 .NET 技术栈的同学找到入门的路径!微软在官方网站上提供了全套 C# 文档,提供从入门到精通的齐全领导。 官网文档地址:主动/英文/中文 英文原版:https://docs.microsoft.com/en...中文版:https://docs.microsoft.com/zh...因为长期积攒,C# 官网文档提供的内容较多,但比拟芜杂,对初学者来说并不是很敌对。而对曾经学习了 C# 的人,作为参考和知识点查找工具来说是十分有用的。然而,官网文档提供了最全、最具体的学习内容,初学者能够追随导读,在这里学习 C# 的基础知识。 对于初学者来说,能够从「C# 基础知识」开始浏览。 C# 基础知识导读第一章 「入门」次要是对 C# 及其环境的介绍,通读即可,不须要认真去咀嚼。这一章提到的概念,大部分都会在「C# 编程指南」和「语言参考」局部找到具体的形容。 其中,「C# 语言介绍」中介绍了 C# 和 .NET 体系结构。C# 和 .NET 密不可分。能够说,C# 就是为了 .NET 而创造的一种语言,所以在学习 C# 的同时,肯定要理解 .NET。学任何一门语言,都有两个重点:一是语法自身,二是撑持该语言的 API 库(函数库/类库等)。.NET SDK 为 C# 提供了根底而且全面的 API 库。 「教程」局部次要通过两种模式进行教学,「基于浏览器的教程」能够在浏览器上一步一步的理解 C# 开发的一些基本概念。但学完「基于浏览器的教程」之后,肯定不要疏忽了「在本地环境中工作」,这是实际环节,是在真正的日常工作环境中编写 C# 程序。这一部分介绍了基于命令行的 C# 我的项目操作和基于 Visual Studio 2019/2022 的 C# 我的项目操作,倡议间接学习后者。基于 dotnet CLI 的局部理解即可,在前面学完 C#,深刻 C# 构建技术和继续集成相干高级常识的时候再进行具体的学习。 第二章「根底」局部须要通读。这一部分的内容最好是每读完一节都在 Visual Studio 或 dotnetfiddle.net 中进行实际。其中「面向对象的编程」局部须要仔细阅读,如果有 C++ 或 Java 的根底,这一部分浏览起来可能会轻松一些;如果没有学过 OOP(Object Oriented Programming,面向对象程序设计)的同学,能够参照别的相干书箱或资料辅助浏览了解。留神,这里提到的「多形性」在少数书籍中叫作「多态性」。 ...

January 27, 2022 · 2 min · jiezi

关于c#:分表分库百亿级大数据存储

NewLife.XCode是一个有15年历史的开源数据中间件,反对netcore/net45/net40,由新生命团队(2002~2019)开发实现并保护至今,以下简称XCode。整个系列教程会大量联合示例代码和运行日志来进行深入分析,蕴含多年开发教训于其中,代表作有百亿级大数据实时计算我的项目。开源地址:https://github.com/NewLifeX/X (求star, 938+) XCode是重度充血模型,以单表操作为外围,不反对多表关联Join,简单查问只能在where上做文章,整个select语句肯定是from单表,因而对分表操作具备人造劣势!!! 浏览本文之前,倡议回顾《百亿级性能》,其中“索引齐备”章节详细描述了大型数据表的外围要点。 100亿数据其实并不多,一个比拟常见的数据分表分库模型:MySql数据库8主8从,每服务器8个库,每个库16张表,共1024张表(从库也有1024张表) ,每张表1000万到5000万数据,整好100亿到500亿数据! 例程分析 例程地位:https://github.com/NewLifeX/X...新建控制台我的项目,nuget援用NewLife.XCode后,建设一个实体模型(批改Model.xml):<Tables Version="9.12.7136.19046" NameSpace="STOD.Entity" ConnName="STOD" Output="" BaseClass="Entity" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://www.newlifex.com https://raw.githubusercontent.com/NewLifeX/X/master/XCode/ModelSchema.xsd" xmlns="http://www.newlifex.com/ModelSchema.xsd"> <Columns> <Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" /> <Column Name="Category" DataType="String" Description="类别" /> <Column Name="Action" DataType="String" Description="操作" /> <Column Name="UserName" DataType="String" Description="用户名" /> <Column Name="CreateUserID" DataType="Int32" Description="用户编号" /> <Column Name="CreateIP" DataType="String" Description="IP地址" /> <Column Name="CreateTime" DataType="DateTime" Description="工夫" /> <Column Name="Remark" DataType="String" Length="500" Description="详细信息" /> </Columns> <Indexes> <Index Columns="CreateTime" /> </Indexes> </Tables>在Build.tt上右键运行自定义工具,生成实体类“历史.cs”和“历史.Biz.cs”。不必批改其中代码,待会咱们将借助该实体类来演示分表分库用法。为了不便,咱们将应用SQLite数据库,因而不须要配置任何数据库连贯,XCode检测到没有名为STOD的连贯字符串时,将默认应用SQLite。此外,也能够通过指定名为STOD的连贯字符串,应用其它非SQLite数据库。 按数字散列分表分库大量订单、用户等信息,可采纳crc16散列分表,咱们把该实体数据拆分到4个库共16张表外面:static void TestByNumber(){ XTrace.WriteLine("按数字分表分库");// 事后筹备好各个库的连贯字符串,动静减少,也能够在配置文件写好for (var i = 0; i < 4; i++){ var connName = $"HDB_{i + 1}"; DAL.AddConnStr(connName, $"data source=numberData\\{connName}.db", null, "sqlite"); History.Meta.ConnName = connName; // 每库建设4张表。这一步不是必须的,首次读写数据时也会创立 //for (var j = 0; j < 4; j++) //{ // History.Meta.TableName = $"History_{j + 1}"; // // 初始化数据表 // History.Meta.Session.InitData(); //}}//!!! 写入数据测试// 4个库for (var i = 0; i < 4; i++){ var connName = $"HDB_{i + 1}"; History.Meta.ConnName = connName; // 每库4张表 for (var j = 0; j < 4; j++) { History.Meta.TableName = $"History_{j + 1}"; // 插入一批数据 var list = new List<History>(); for (var n = 0; n < 1000; n++) { var entity = new History { Category = "交易", Action = "转账", CreateUserID = 1234, CreateTime = DateTime.Now, Remark = $"[{Rand.NextString(6)}]向[{Rand.NextString(6)}]转账[¥{Rand.Next(1_000_000) / 100d}]" }; list.Add(entity); } // 批量插入。两种写法等价 //list.BatchInsert(); list.Insert(true); }}}通过 DAL.AddConnStr 动静向零碎注册连贯字符串:var connName = $"HDB_{i + 1}"; ...

January 11, 2022 · 3 min · jiezi

关于c#:Blazor是春天还是寒风里的挣扎

官网解释BlazorBlazor容许您应用c#而不是JavaScript构建交互式web UI。 Blazor利用由可重用的web UI组件组成,这些组件应用c#、HTML和CSS实现。客户端和服务器代码都是用c#编写的,容许您共享代码和库。 Blazor 是一个应用 .NET 生成交互式客户端 Web UI 的框架: 应用 C# 代替 JavaScript 来创立信息丰盛的交互式 UI。共享应用 .NET 编写的服务器端和客户端应用逻辑。将 UI 出现为 HTML 和 CSS,以反对泛滥浏览器,其中包含挪动浏览器。与旧式托管平台(如 Docker)集成。应用 .NET 进行客户端 Web 开发可提供以下劣势: 应用 C# 代替 JavaScript 来编写代码。利用现有的 .NET 库生态系统。在服务器和客户端之间共享应用逻辑。受害于 .NET 的性能、可靠性和安全性。在 Windows、Linux 和 macOS 上应用 Visual Studio 放弃高效工作。以一组稳固、功能丰富且易用的通用语言、框架和工具为根底来进行生成。看到这里有些小伙伴手中的瓜曾经要丢进去了,确实有局部是夸张了的,起码VS在三个平台高效工作这事儿,嗯。。。其余的持续吃瓜吧Blazor Vs MVC什么是MVC官网解释:ASP.NET Core MVC 是应用“模型-视图-控制器”设计模式构建 Web 利用和 API 的丰盛框架。 圈重点,Blazor是交互式Web UI,而MVC是Web利用和API什么是交互式Web UI谷歌、百度转了一圈,没有这个解释,连Wiki也是一脸懵逼。 尝试了解一下吧,交互式Web UI重点在于交互,而Blazor的官网解释是用C#代替JavaScript,那咱们看看JavaScript有什么性能,我百度找一段过去: 嵌入动静文本于HTML页面对浏览器事件做出响应读写HTML元素在数据被提交到服务器之前验证数据检测访客的浏览器信息。管制cookies,包含创立和批改等有这些根底性能,用户不须要在动态页面里跳来跳去了,确实体验会好很多Blazor有什么劣势提供了一些交互能力,不再是纯正的动态页,尽管mvc能够应用JavaScript达到同样的成果,但你须要把握JavaScript,甚至还要再学习jQuery、Angular、Vue等。而Blazor提供的交互能力则是应用C#。 吹是吹完了,但你真的能够100% C#吗?这很难,你会遇到各种问题,比方兼容性、性能等。好了,那我能够不必了吗?等等,上面还有瓜Blazor Vs 古代前端(Angular、Vue等)咱们从几个方面来比照一下吧 调试Blazor:Vistual Stuidio + F5,VS Code/命令行工具 + dotnet watch ...

December 28, 2021 · 2 min · jiezi

关于c#:AgileConfig155-发布-支持-JSON-编辑模式

本次更新退出了2个新的编辑模式:JSON 编辑模式、TEXT 编辑模式。特地是 JSON 编辑模式是大家比拟期待的一个性能。因为大家都习惯了 appsettings.json 的配置编辑模式,所以天生的喜爱 JSON 视图。有了 JSON 编辑模式后,大家就能够间接把原来的 appsettings.json 间接复制过去,点击保留就能够原样导入到 AgileConfig 里了。也能够持续应用对象嵌套对象,数组等高级模式。 JSON 视图编辑模式点击右上角“编辑 JSON”按钮会弹出 JSON 编辑视图。该编辑框集成了一个 json 代码编辑器- monaco-editor 不便用户疾速的编辑 json 配置文件。顺便提一下 monaco 这个是微软开源的一个编辑器,看它的官网介绍你就晓得他有多牛了:The Monaco Editor is the code editor that powers VS Code 。对没错,它就是 VS Code 的编辑器。 当初你能够像应用 appsettings.json 一样来定义配置文件了。比方 { x: {b: 'a' } } 对象嵌套对象,比方数组 ['1', '2' , '3'] 。 留神: 非法的json文件,编辑器会给出提醒,并且不能保留对于 bool 或者 intger 类型定义的时候没有问题,然而保留后零碎会默认给转成文本类型比方 false='false' , 1='1' 。因为所有的json内容转换的时候都会存储成文本类型的键值对。然而释怀这不会影响你在 .NET 程序里应用 IConfiguration 来读取绑定应用配置。编辑好json文件后,点击“保留”按钮,零碎会比照新老配置,主动列出哪些是“新增”的配置项,哪里是“编辑”的配置项,哪些是“删除”的配置项。 ...

December 20, 2021 · 1 min · jiezi

关于c#:AgileConfig轻量级配置中心140发布重构了发布功能

退出 NCC先说一个事,AgileConfig 在 7 月底终于通过了 NCC 社区的审核,正式成为了 NCC 小家庭的一员。这对 AgileConfig 来说是一个里程碑,心愿退出 NCC 后能更好的帮忙到大家。同时责任也更大了,自己会判若两人的对这个我的项目保护上来,感激反对。 release-1.4.0本次1.4.0公布版本是一个比拟大更新。解决了 AgileConfig 一些长期存在的性能上的问题。之前版本的公布、回滚只针对独自某个配置,当对某个配置编辑后会记录批改历史,并且公布后的配置批改是实时失效的。这会带来2个比拟大的问题: 没有方法追踪“删除”的配置 因为批改历史记录针对的是单个配置,然而当应用删除操作的时候,整个配置会在列表里移除,导致想要复原的时候都没有入口能够找到这个被删除的配置。单个配置批改实时上线 之前的版本,当对某个配置批改或者删除后配置会实时同步至客户端。这样会带来一个问题:有的时候咱们心愿批改好多个配置后同时公布上线,因为配置之间很可能是依赖的关系。1.4.0 重构了公布性能,解决了以上2个问题。新版本不在针对某个配置独自管制上线、下线。能够间断对多个配置新增、删除、编辑后进行集中公布,同时反对记录公布日志。 编辑配置上面演示下新版的公布如何应用。 当初新增、编辑、删除配置后,配置不会间接上线,会处于一个待发布的状态。在编辑列表的右上角会提醒待发布配置的统计状况。 公布配置批改完配置后,须要点击“公布”按钮进行确认公布。公布胜利后批改过后的配置会实时更新至客户端。 留神 : 新版本告诉客户端变更的事件不再辨别add、update、delete,全副为reload。历史版本新版本对公布的历史能够进行查看,同时反对回滚至某个公布版本的能力。 历史版本把每次公布的变更状况按时间轴列出。 点击“回滚”能够回滚至某个时刻的公布版本的状态。 留神: 回滚操作会清空以后所有待发布的配置项最初✨✨✨Github地址:https://github.com/dotnetcore/AgileConfig 开源不易,欢送star✨✨✨ 演示地址:http://agileconfig_server.xbaby.xyz/ 超级管理员账号:admin 明码:123456

December 20, 2021 · 1 min · jiezi

关于c#:c基础接口

接口和类 其实有很多雷同的中央,但接口不能被实例化,接口更多的是定义一些束缚,标准,比方二个功能模块 都会用到Create办法,惯例的能够应用类 创立二个办法来实现Create但用接口就是先定义接口 /// <summary>/// 接口申明/// </summary>public interface ICreate{ void DoCreate();}再实现接口, /// <summary>/// 接口实现/// </summary>public class ModularA : ICreate{ public void DoCreate() { Console.Write("ModularA"); Console.ReadKey(); }}public class ModularB : ICreate{ public void DoCreate() { Console.Write("ModularB"); Console.ReadKey(); }}咱们再应用的时候 var modularA = new ModularA(); modularA.DoCreate(); var modularB = new ModularB(); modularB.DoCreate();其实在你会发现,后续再新增Create办法 只须要去写实现过程,不须要再定义。

December 17, 2021 · 1 min · jiezi

关于c#:ApacheCN-C-译文集-20211124-更新

C# 代码整洁指南 零、前言一、C# 代码规范和准则二、代码审查——过程和重要性三、类、对象和数据结构四、编写整洁的函数五、异样解决六、单元测试七、端到端系统测试八、线程和并发九、设计和开发 API十、应用 API 密钥和 Azure 密钥保存库爱护 API十一、解决横切关注点十二、应用工具来晋升代码品质十三、重构 C# 代码——确定代码异味十四、重构 C# 代码——实现设计模式十五、答案C#10 和 .NET6 代码跨平台开发 零、前言一、你好,C#!欢送应用.NET!二、谈谈 C#三、控制流、转换类型和解决异样四、编写、调试和测试函数五、应用面向对象编程构建本人的类型六、实现接口和继承类七、打包和散发.NET 类型八、应用常见的.NET 类型九、应用文件、流和序列化十、应用实体框架外围解决数据十一、应用 LINQ 查问和操作数据十二、应用多任务进步性能和可扩展性十三、C# 和.NET 的理论利用简介十四、应用 ASP.NETCore 页面构建网站十五、应用模型-视图-控制器模式构建网站十六、构建和应用 Web 服务十七、应用 Blazor 构建用户界面十八、后记C# 数据结构和算法 一、前言二、开始二、数组和列表三、栈和队列四、字典和汇合五、树的变种六、摸索图七、总结C# 机器学习我的项目 零、前言一、机器学习建模根底二、垃圾邮件过滤三、推特情感剖析四、外汇汇率预测五、屋宇和财产的公道价值六、客户细分七、音乐类型举荐八、手写数字辨认九、网络攻击检测十、信用卡欺诈检测十一、下一步是什么?C# 和 .NETCore 设计模式实用指南 零、前言第一局部:C# 和.NETCore 中设计模式的要点 一、NETCore 和 C# 中的 OOP 概述二、古代软件设计模式与准则第二局部:深入探讨.NETCore 中的工具和模式 三、实现设计模式——基础知识第 1 局部四、实现设计模式——基础知识第 2 局部五、实现设计模式——.NETCore六、Web 利用设计模式的实现——第 1 局部七、Web 利用设计模式的实现——第 2 局部第三局部:函数式编程、反应式编程和云编程 八、.NETCore 中的并发编程九、函数式编程实际十、反应式编程模式和技术十一、先进的数据库设计和利用技术十二、云编程十三、其它最佳做法十四、答案C# 神经网络编程实用指南 零、前言一、疾速回顾二、一起构建咱们的第一个神经网络三、决策树与随机森林四、人脸和静止检测五、应用 ConvNetSharp 训练 CNN十、基于 TensorFlowSharp 的指标检测十一、基于 CNTK 与 LSTM 的工夫序列预测十二、GRU 与 LSTM、RNN 和前馈网络的比拟十三、激活函数计时十四、函数优化参考C#5 多线程秘籍 ...

December 8, 2021 · 2 min · jiezi

关于c#:小失误大问题-为已发布的接口更名

写代码不免呈现失误。在对某些曾经公布的库进行降级或者审查的时候,就有可能会发现一些接口名称须要变更。比方,晚期命名不合乎特定标准,或者呈现了难以发现的拼写错误等。有错当然是要改的,然而间接更名会影响到已公布的接口。粗犷的名称变更实质上是删除了旧接口,创立了新接口,对 API 用户来说极具破坏性 —— 用户会发现所有用到这些接口的中央都编译不过,或者不能运行了,这几乎就是一场劫难。 本文次要以 C# 为例介绍对库接口更名的解决 —— 在 Assembly 外部,间接应用“重命名”重构办法,借助 IDE/Editor 的能力就能够实现变更;然而对于凋谢进来的接口,就必须放弃接口兼容性,并申明过期工夫。 本文以 C# 为例,然而解决形式和重构思维是语言无关的!解决不符合规范的类属性命名这一节次要是解决属性更名的问题。办法更名和属性更名是同样的情理,前面不再赘述。 假如有如下定义: public class ActionResult : IActionResult { public int code { get; set; } public string message { get; set; }}这个定义命名不合乎“公开属性应用 Pascal Case 命名规定”的标准。但作为一个曾经被宽泛应用的库,间接重命名将产生微小的毁坏,所以这里应该按正确的名称增加属性,并将旧的属性申明为过期。 public class ActionResult : IActionResult { public int Code { get; set; } public string Message { get; set; } [Obsolete("因标准命名,将从 v3.4 版本中删除,请应用 Code 代替")] public int code { get => Code; set => Code = value; } [Obsolete("因标准命名,将从 v3.4 版本中删除,请应用 Message 代替")] public string message { get => Message; set => Message = value; }}不过批改后的 ActionResult 会在序列化的时候呈现问题。库中应用了 Newtonsoft JSON 来失去 JSON,按我的项目中的 JSON 标准,键名会应用 Camel Case 命名规定,所以在配置中增加了 CamelCasePropertyNamesContractResolver 实例。那么 ActionResult 的 Code 和 code 属性都会被解决为 "code" 这个键名,于是产生了重名的抵触。 ...

December 8, 2021 · 2 min · jiezi

关于c#:C80-可空引用类型

介绍咱们的我的项目代码运行时最频繁的谬误之一就是 System.NullReferenceException 异样,c#8.0减少的可为空援用类型就是用来帮忙开发者升高甚至打消NULL异样。咱们须要留神的是可空援用类型是语法级别的性能,也就是代码编写的时候就会受到编程束缚,这个与可为空值类型是不一样的。我的项目反对c#8.0请参见C# 语言版本控制。 目录在我的项目中启用可空援用类型反对将变量标注为可空援用类型应用示例进阶缺点在我的项目中启用可空援用类型反对<Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> </PropertyGroup> </Project>在我的项目文件中减少<Nullable>enable</Nullable>后,我的项目代码中的援用类型将被解析拆分为不可空援用类型和可空援用类型。 将正告晋升为异样可空援用类型性能是以正告的模式呈现,并不会烦扰我的项目生成编译,约束力较弱。如果想严格要求本身,那咱们可将特定的正告变为异样来晋升约束力。 <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>net6.0</TargetFramework> <Nullable>enable</Nullable> <WarningsAsErrors> $(WarningsAsErrors);CS8600;CS8601;CS8602;CS8603;CS8604;CS8609;CS8610;CS8614;CS8616;CS8618;CS8619;CS8622;CS8625 </WarningsAsErrors> </PropertyGroup> </Project>相干技术文档C# 编译器选项 - 谬误和正告 | Microsoft Docs,Non-nullable references with C# 8 and .NET Core 3.0 · Cezary Piątek Blog (cezarypiatek.github.io),大家在编写代码时遇到Microsoft.CodeAnalysis.CSharp分析器所给的正告代码,都可依照本人的要求将其变为异样来束缚本人。 将变量标注为可空援用类型咱们平时应用的援用类型属于不可空援用类型,在其后附加?便为可空援用类型。 string name; //不可空字符串string? adress; //可空字符串泛型public TKey GetKey<TKey>(){ //必须返回不可空类型}public TValue? GetValue<TValue>(){ //可返回可空类型}应用示例 如上示例,因为Student领有默认的空构造函数new Student(),此构造函数会使Name和Adress属性为null,所以分析器收回了CS8618的正告。 咱们将空构造函数写上,此时正告智能的转移到构造函数上了。 咱们在构造函数中将可能为null的string类型属性附上值,正告打消。而string?类型无需解决,因为它是容许为null的。 以上两种形式也能够打消正告。 在GetStudentNames办法中,咱们应用Student的EnglishName属性时,分析器收回了CS8604正告,因为EnglishName属性是可空援用类型,无奈放入List<string>中,只能放入在List<string?>中。 咱们应用??判断当EnglishName为null时,应用不可空援用类型属性Name,此时CS8604正告打消。 进阶可空援用类型模式中,属性是能够被拆分为两种模式的,其一是属性是否可被赋值null,其二是属性的值是否可能为null。大家可能对这句话了解起来有点懵,请接着看上面的解说。 [AllowNull]不可为null的援用类型属性容许被赋值null 下面代码中,Adress属性即便被赋值null,也不会使其值为null,不会在代码中引发潜在的Null异样。所以此场景是正当且被容许的。 [DisallowNull]可为null的援用类型属性不容许赋值为null ...

December 8, 2021 · 1 min · jiezi

关于c#:如何在-ASPNET-Core-中构建轻量级服务

在 ASP.NET Core 中解决 Web 应用程序时,咱们可能常常心愿构建轻量级服务,也就是没有模板或控制器类的服务。 轻量级服务能够升高资源耗费,而且可能进步性能。咱们能够在 Startup 或 Program 类中创立这些轻量级服务或 API。 1. 应用 VS2022 创立 ASP.NET Core 我的项目咱们在 Visual Studio 2022 中创立一个 ASP.NET Core 我的项目。依照以下步骤在 Visual Studio 2022 中创立一个新的 ASP.NET Core Web API 6 我的项目。 1) 启动 Visual Studio 2022 IDE。2) 单击 “Create new project”。3) 在 “Create new project” 窗口中,从显示的模板列表中抉择 “ASP.NET Core Web API”。4) 点击下一步。5) 在 “Configure your new project” 窗口中,指定新我的项目的名称和地位。6) 依据您的偏好,可抉择选中 “Place solution and project in the same directory” 复选框。7) 点击下一步。8) 在接下来显示的 “Additional Information” 窗口中,从顶部的下拉列表中抉择 .NET 6.0 作为指标框架。将 “Authentication Type” 保留为 “None”(默认)。9) 确保未选中 “Enable Docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 复选框,因为咱们不会在此处应用任何这些性能。您也能够抉择勾销选中 “Use controllers(勾销选中以应用起码的 API)” 复选框,因为咱们将创立本人的控制器。10) 单击创立。这将在 Visual Studio 2022 中创立一个新的 ASP.NET Core 6 Web API 我的项目。咱们将在本文的后续局部中应用该我的项目,来阐明如何应用轻量级服务。 ...

December 8, 2021 · 3 min · jiezi

关于c#:如何使用Redis实现令牌桶算法

在限流算法中有一种令牌桶算法,该算法能够应答短暂的突发流量,这对于事实环境中流量不怎么平均的状况特地有用,不会频繁的触发限流,对调用方比拟敌对。 例如,以后限度10qps,大多数状况下不会超过此数量,但偶然会达到30qps,而后很快就会恢复正常,假如这种突发流量不会对系统稳定性产生影响,咱们能够在肯定水平上容许这种刹时突发流量,从而为用户带来更好的可用性体验。这就是应用令牌桶算法的中央。 令牌桶算法原理如下图所示,该算法的基本原理是:有一个容量为X的令牌桶,每Y单位工夫内将Z个令牌放入该桶。如果桶中的令牌数量超过X,那么它将被抛弃。解决申请时,须要先从令牌桶中取出令牌,如果拿到了令牌,则持续解决;如果拿不到令牌,则拒绝请求。 能够看出,在令牌桶算法中设置X,Y和Z的数量尤为重要。Z应该比每Y单位工夫内的申请数稍大,零碎将长时间处于此状态;X是零碎容许的刹时最大申请数,并且零碎不应该长时间处于此状态,否则就会频繁触发限流,此时表明流量呈现了超预期的状况,须要及时考察起因并采取相应措施。 Redis实现令牌桶算法之前看过有些程序实现的令牌桶,其向桶中放入令牌的办法是启动一个线程,每隔Y单位工夫减少一次令牌数量,或者在Timer中定时执行这一过程。我不太称心这种办法, 起因有二,一是节约线程资源,二是因为调度的问题执行工夫不准确。 这里确定令牌桶中令牌数量的办法是通过计算得出,首先算出从上次申请到这次申请通过了多长时间,是否达到发令牌的工夫阈值,而后减少的令牌数是多少,这些令牌可能放到桶中的是多少。 Talk is cheap! 下边就来看看Redis中怎么实现的,因为波及到屡次与Redis的交互,这里为了进步限流解决的吞吐量,缩小程序与Redis的交互次数,采纳了Redis反对的Lua script,Lua script的执行是原子的,所以也不必放心呈现脏数据的问题。 代码节选自 FireflySoft.RateLimit ,它不仅反对一般主从部署Redis,还反对集群Redis,所以吞吐量能够通过程度扩大的形式进行晋升。为了不便浏览,这里减少一些正文,理论是没有的。 -- 定义返回值,是个数组,蕴含:是否触发限流(1限流 0通过)、以后桶中的令牌数local ret={}ret[1]=0-- Redis集群分片Key,KEYS[1]是限流指标local cl_key = '{' .. KEYS[1] .. '}'-- 获取限流惩办的以后设置,触发限流惩办时会写一个有过期工夫的KV-- 如果存在限流惩办,则返回后果[1,-1]local lock_key=cl_key .. '-lock'local lock_val=redis.call('get',lock_key)if lock_val == '1' then ret[1]=1 ret[2]=-1 return ret;end-- 这里省略局部代码-- 获取[上次向桶中投放令牌的工夫],如果没有设置过这个投放工夫,则令牌桶也不存在,此时:-- 一种状况是:首次执行,此时定义令牌桶就是满的。-- 另一种状况是:较长时间没有执行过限流解决,导致承载这个工夫的KV被开释了,-- 这个过期工夫会超过天然投放令牌到桶中直到桶满的工夫,所以令牌桶也应该是满的。local last_time=redis.call('get',st_key)if(last_time==false)then -- 本次执行后残余令牌数量:桶的容量- 本次执行耗费的令牌数量 bucket_amount = capacity - amount; -- 将这个令牌数量更新到令牌桶中,同时这里有个过期工夫,如果长时间不执行这个程序,令牌桶KV会被回收 redis.call('set',KEYS[1],bucket_amount,'PX',key_expire_time) -- 设置[上次向桶中放入令牌的工夫],后边计算应放入桶中的令牌数量时会用到 redis.call('set',st_key,start_time,'PX',key_expire_time) -- 返回值[以后桶中的令牌数] ret[2]=bucket_amount -- 无需其它解决 return retend-- 令牌桶存在,获取令牌桶中的以后令牌数local current_value = redis.call('get',KEYS[1])current_value = tonumber(current_value)-- 判断是不是该放入新令牌到桶中了:以后工夫-上次投放的工夫 >= 投放的工夫距离last_time=tonumber(last_time)local last_time_changed=0local past_time=current_time-last_timeif(past_time<inflow_unit)then -- 不到投放的时候,间接从令牌桶中取走令牌 bucket_amount=current_value-amountelse -- 须要放入一些令牌, 预计投放数量 = (距上次投放过来的工夫/投放的工夫距离)*每单位工夫投放的数量 local past_inflow_unit_quantity = past_time/inflow_unit past_inflow_unit_quantity=math.floor(past_inflow_unit_quantity) last_time=last_time+past_inflow_unit_quantity*inflow_unit last_time_changed=1 local past_inflow_quantity=past_inflow_unit_quantity*inflow_quantity_per_unit bucket_amount=current_value+past_inflow_quantity-amountend-- 这里省略局部代码ret[2]=bucket_amount-- 如果桶中残余数量小于0,则看看是否须要限流惩办,如果须要则写入一个惩办KV,过期工夫为惩办的秒数if(bucket_amount<0)then if lock_seconds>0 then redis.call('set',lock_key,'1','EX',lock_seconds,'NX') end ret[1]=1 return retend-- 来到这里,代表能够胜利扣减令牌,则须要更新令牌桶KVif last_time_changed==1 then redis.call('set',KEYS[1],bucket_amount,'PX',key_expire_time) -- 有新投放,更新[上次投放工夫]为本次投放工夫 redis.call('set',st_key,last_time,'PX',key_expire_time)else redis.call('set',KEYS[1],bucket_amount,'PX',key_expire_time)endreturn ret通过以上代码,能够看出,其次要处理过程是: ...

December 8, 2021 · 1 min · jiezi

关于c#:TIOBE-12-月榜C-有望冲击年度编程语言奖PHP-遗憾跌出前十

近日,TIOBE 颁布了 12 月份编程语言指数排行榜。其中,Python、C、Java 仍旧分列前三甲,而 PHP 已遗憾跌出前十,C# 或将无望冲击“TIOBE 年度编程语言奖”。 据悉,TIOBE 将于下个月发表 “TIOBE年度编程语言奖”,该奖项将在 2021 年度评分最高的编程语言中选出。目前,C# 被看做是最有可能取得这一头衔的候选者。 TIOBE CEO Paul Jansen 示意,C# 在其 21 年的历史中从未取得过“TIOBE索引编程语言年度奖”,只管它在过来 20 年中始终名列前十,让咱们一起期待下个月的惊喜吧! 本次 TIOBE 指数榜单前 10 位里,Python 已间断三个月霸榜第一;排名变动最大的就是 PHP ,它在上个月位列第 10 名,本月已跌至第 12 位,取而代之的是 Swift (上个月第 14 名,本月升至第 10 名)。其余前十语言的排名与上个月雷同。 榜单第 11-20 名中,相比上个月,R 从第 15 升至第 11 名、Delphi/Object Pascal从第 17 名升至第 16 名、Fortran 从第 19 名升至第 17 名。 同时,PHP 从上个月的第 10 名跌至第 12 名、Classic Visual Basic 从上个月的第 11 名降落至第 13 名、Groovy 从上个月的第 12 名降落至第 14 名、Ruby 从上个月的第 13 名降落至第 15 名、Perl 从上个月的第 16 名降落至第 18 名、GO 也从上个个月的第 18 名降落至第 19 名,行将要跌出前20名,而 MATLAB 则与上个月排名雷同,本月仍然位列第 20 名。 ...

December 7, 2021 · 1 min · jiezi

关于c#:00043c-登录对话框登录成功后关闭并显示主窗体

/// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);//这是登录窗体,ShowDialog的形式。dialog返回OK,则显示:ComListForm主窗体。 Login form1 = new Login(); form1.ShowDialog(); if (form1.DialogResult == DialogResult.OK) { Application.Run(new ComListForm()); } else { return; } //Application.Run(new ComListForm()); }在登录按钮click事件中:登录胜利,执行: this.DialogResult = DialogResult.OK; this.Close();

December 3, 2021 · 1 min · jiezi

关于c#:详解-Net6-Minimal-API-的使用方式

随着 .Net6 的公布,微软也改良了对之前 ASP.NET Core 构建形式,应用了新的 Minimal API 模式。以前默认的形式是须要在 Startup 中注册 IOC 和中间件相干,然而在 Minimal API 模式下你只须要简略的写几行代码就能够构建一个 ASP.NET Core的Web 利用,堪称十分的简略,加之配合 c# 的 global using 和 Program 的顶级申明形式,使得 Minimal API 变得更为简洁,不得不说 .NET 团队在 .NET 上近几年下了不少功夫,接下来咱们就来大抵介绍下这种极简的应用模式。 1. 应用形式应用 Visual Studio 2022 新建的 ASP.NET Core 6 的我的项目,默认的形式就是 Minimal API 模式,整个 Web 程序的构造看起来更加简略,再i加上微软对 Lambda 的改良,使其能够对 Lambda 参数进行 Attribute 标记,有的场景甚至能够放弃去定义 Controller 类了。 2. 几行代码构建Web程序应用 Minimal API 最简略的形式就是能通过三行代码就能够构建一个 WebApi 的程序,代码如下: var app = WebApplication.Create(args);app.MapGet("/", () => "Hello World");app.Run();是的你没有看错,仅仅这样运行起来就能够,默认监听的 http://localhost:5000 和 https://localhost:5001,所以间接在浏览器输出http://localhost:5000地址就能够看到浏览器输入Hello World字样。 ...

December 3, 2021 · 4 min · jiezi

关于c#:minimalapi介绍

Minimal APIs 是.Net 6 中新增的模板,借助 C# 10 的一些个性以起码的代码运行一个 Web 服务。本文脱离 VS 通过 VS Code,实现一个简略的 Minimal Api 我的项目的开发。 <!-- more --> 创立我的项目新建一个文件夹,用来治理咱们的我的项目文件,文件夹内启动命令行,通过dotnet new web创立我的项目。 Minimal├── obj├── Properties├── appsettings.Development.json├── appsettings.json├── Minimal.csproj└── Program.cs运行我的项目我的项目目录下执行dotnet run,运行我的项目。 PS C:\Users\User01\Desktop\Minimal> dotnet run正在生成...info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:7221info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5252info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down.info: Microsoft.Hosting.Lifetime[0] Hosting environment: Developmentinfo: Microsoft.Hosting.Lifetime[0] Content root path: C:\Users\User01\Desktop\Minimal\运行成果如下: Codingbuilder 实例提供了 Services 属性,能够实现本来 Startup 类 ConfigureServices 办法中注册服务的工作,Configure 办法的一些 Use 操作则通过 app 来实现。 ...

November 30, 2021 · 2 min · jiezi

关于c#:解析可空类型

C# 单问号 ? 与 双问号 ??? 单问号用于对 int、double、bool 等无奈间接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 Nullable 类型的。 int? i = 3;等同于: Nullable<int> i = new Nullable<int>(3);int i; //默认值0int? ii; //默认值null?? 双问号用于判断一个变量在为 null 的时候返回一个指定的值。 接下来咱们具体阐明。 C# 可空类型(Nullable)C# 提供了一个非凡的数据类型,nullable 类型(可空类型),可空类型能够示意其根底值类型失常范畴内的值,再加上一个 null 值。 例如,Nullable< Int32 >,读作"可空的 Int32",能够被赋值为 -2,147,483,648 到 2,147,483,647 之间的任意值,也能够被赋值为 null 值。相似的,Nullable< bool > 变量能够被赋值为 true 或 false 或 null。 在解决数据库和其余蕴含可能未赋值的元素的数据类型时,将 null 赋值给数值类型或布尔型的性能特地有用。例如,数据库中的布尔型字段能够存储值 true 或 false,或者,该字段也能够未定义。 申明一个 nullable 类型(可空类型)的语法如下: < data_type> ? <variable_name> = null;上面的实例演示了可空数据类型的用法: ...

November 25, 2021 · 1 min · jiezi

关于c#:ASPNET-使用-Dispose-释放资源的四种方法

Dispose 和 Finalize 是运行的 .NET 和 .NET Core 应用程序开释占用的资源的两种办法。通常,如果应用程序中有非托管资源,应该显式地开释这些资源占用的资源。 因为 Finalize 的非确定性,以及在性能方面的老本很高,因而 Dispose 办法的应用频率远高于 Finalize。其实,咱们能够在一个实现了 IDisposable 接口的类型上应用 Dispose 办法。 本文中提供的代码示例均默认运行在 Visual Studio 2022。 1. 应用 VS2022 创立 ASP.NET Core 我的项目咱们在 Visual Studio 2022 中创立一个 ASP.NET Core 我的项目。依照以下步骤在 Visual Studio 2022 中创立一个新的 ASP.NET Core Web API 6 我的项目。 1) 启动 Visual Studio 2022 IDE。2) 单击 “Create new project”。3) 在 “Create new project” 窗口中,从显示的模板列表中抉择 “ASP.NET Core Web API”。4) 点击下一步。5) 在 “Configure your new project” 窗口中,指定新我的项目的名称和地位。6) 依据您的偏好,可抉择选中 “Place solution and project in the same directory” 复选框。7) 点击下一步。8) 在接下来显示的 “Additional Information” 窗口中,从顶部的下拉列表中抉择 .NET 6.0 作为指标框架。将 “Authentication Type” 保留为 “None”(默认)。确保选中 “Use controllers ...” 选项。9) 确保未选中 “Enable Docker,”、“Configure for HTTPS” 和 “Enable Open API Support” 复选框,因为咱们不会在此处应用任何这些性能。您也能够抉择勾销选中 “Use controllers(勾销选中以应用起码的 API)” 复选框,因为咱们将创立本人的控制器。10) 单击创立。这将在 Visual Studio 2022 中创立一个新的 ASP.NET Core 6 Web API 我的项目。咱们将在本文的后续局部中应用该我的项目来阐明 Dispose 的用法。 ...

November 24, 2021 · 2 min · jiezi

关于c#:手把手教你学Dapr-9-可观测性

目录手把手教你学Dapr - 1. .Net开发者的大时代 手把手教你学Dapr - 2. 必须晓得的概念 手把手教你学Dapr - 3. 应用Dapr运行第一个.Net程序 手把手教你学Dapr - 4. 服务调用 手把手教你学Dapr - 5. 状态治理 手把手教你学Dapr - 6. 公布订阅 手把手教你学Dapr - 7. Actors 手把手教你学Dapr - 8. 绑定 手把手教你学Dapr - 9. 可观测性 介绍通过Tracing(跟踪)、Metrics(指标)、Logs(日志)和Health(运行状况)监控应用程序。 分布式跟踪Dapr 应用 Zipkin 协定进行分布式跟踪 和 Metrics 收集。因为 Zipkin 协定的普遍性,许多后端都是开箱即用的,例如 Stackdriver、Zipkin、New Relic 等。联合 OpenTelemetry Collector,Dapr 能够将跟踪导出到许多其余后端,包含但不限于 Azure Monitor、Datadog、Instana、Jaeger 和 SignalFX。 Tracing设计Dapr 在 Dapr Sidecar 中增加了一个 HTTP/gRPC 中间件。中间件拦挡所有 Dapr 和应用程序流量,并主动注入关联 ID 以跟踪分布式事务。这种设计有几个益处: 无需代码检测。应用可配置的跟踪级别主动跟踪所有流量。跨微服务的一致性跟踪行为。跟踪是在 Dapr Sidecar 上配置和治理的,因而它在由不同团队制作并可能用不同编程语言编写的服务之间保持一致。可配置和可扩大。利用 Zipkin API 和 OpenTelemetry Collector,Dapr 跟踪能够配置为与风行的跟踪后端一起应用,包含客户可能领有的自定义后端。您能够同时定义和启用多个导出器。<!-- more --> ...

November 19, 2021 · 3 min · jiezi

关于c#:如何提高C-StringBuilder的性能

本文探讨应用C# StringBuilder 的最佳实际,用于缩小内存调配,进步字符串操作的性能。 在 .NET 中,字符串是不可变的类型。每当你在 .NET 中批改一个字符串对象时,就会在内存中创立一个新的字符串对象来保留新的数据。相比之下,StringBuilder 对象代表了一个可变的字符串,并随着字符串大小的增长动静地扩大其内存调配。 String 和 StringBuilder 类是你在 .NET Framework 和 .NET Core 中解决字符串时常常应用的两个风行类。然而,每个类都有其长处和毛病。 BenchmarkDotNet 是一个轻量级的开源库,用于对 .NET 代码进行基准测试。BenchmarkDotNet 能够将你的办法转化为基准,跟踪这些办法,而后提供对捕捉的性能数据的洞察力。在这篇文章中,咱们将利用 BenchmarkDotNet 为咱们的 StringBuilder 操作进行基准测试。 要应用本文提供的代码示例,你的零碎中应该装置有 Visual Studio 2019 或者以上版本。 1. 在Visual Studio中创立一个控制台应用程序我的项目首先让咱们在 Visual Studio中 创立一个 .NET Core 控制台应用程序我的项目。假如你的零碎中曾经装置了 Visual Studio 2019,请依照上面的步骤创立一个新的 .NET Core 控制台应用程序我的项目。 启动 Visual Studio IDE。点击 "创立新我的项目"。在 "创立新我的项目 "窗口中,从显示的模板列表中抉择 "控制台应用程序(.NET外围)"。点击 "下一步"。在接下来显示的 "配置你的新我的项目 "窗口中,指定新我的项目的名称和地位。点击创立。这将在 Visual Studio 2019 中创立一个新的 .NET Core 控制台应用程序我的项目。咱们将在本文的后续章节中应用这个我的项目来解决 StringBuilder。 2. 装置 BenchmarkDotNet NuGet包要应用 BenchmarkDotNet,你必须装置 BenchmarkDotNet 软件包。你能够通过 Visual Studio 2019 IDE 内的 NuGet 软件包管理器,或在 NuGet 软件包管理器控制台执行以下命令来实现。 ...

November 18, 2021 · 2 min · jiezi

关于c#:手把手教你学Dapr-8-绑定

目录手把手教你学Dapr - 1. .Net开发者的大时代 手把手教你学Dapr - 2. 必须晓得的概念 手把手教你学Dapr - 3. 应用Dapr运行第一个.Net程序 手把手教你学Dapr - 4. 服务调用 手把手教你学Dapr - 5. 状态治理 手把手教你学Dapr - 6. 公布订阅 手把手教你学Dapr - 7. Actors 手把手教你学Dapr - 8. 绑定 介绍应用绑定,您能够应用来自内部零碎的事件触发您的应用程序,或与内部零碎交互。这个构建块为您和您的代码提供了几个益处: 打消连贯和轮询音讯零碎(如队列和音讯总线)的复杂性关注业务逻辑,而不是如何与零碎交互的实现细节让您的代码不受 SDK 或库的影响解决重试和故障复原运行时在绑定之间切换构建可移植的应用程序,其中设置了特定于环境的绑定,不须要更改代码输出绑定输出绑定用于在产生来自内部资源的事件时触发您的应用程序。可选的payload和元数据能够与申请一起发送。 为了从输出绑定接管事件: 定义形容绑定类型及其元数据(连贯信息等)的组件 YAML侦听传入事件的 HTTP 端点,或应用 gRPC proto 库获取传入事件输入绑定输入绑定容许您调用内部资源。可选的payload和元数据能够与申请一起发送。 为了调用输入绑定: 定义形容绑定类型及其元数据(连贯信息等)的组件 YAML应用 HTTP 或 gRPC 办法调用具备可选payload的绑定应用场景应用绑定,你的代码能够被来自不同资源的传入事件触发,这些资源能够是任何货色:队列、消息传递管道、云服务、文件系统等。 这对于事件驱动解决、数据管道或只是对事件做出个别反馈并进行进一步解决是现实的。 Dapr 绑定容许您: 在不蕴含特定 SDK 或库的状况下接管事件在不更改代码的状况下替换绑定专一于业务逻辑而不是事件资源实现目前Dapr还不反对跨Dapr互调用,而yaron给出的解决方案之一就是绑定目前绑定反对40中组件,包含Aliyun、Azure、AWS等多家云服务厂商的产品,也包含常见的如Cron, kafka, MQTT, SMTP, Redis以及各种MQ等。 以下图片是.Net Dapr官网教程里的一个示例 配置组件本篇文章将用rabbitmq来演示(为什么不必redis,因为redis翻车了,只反对output,没留神看supported),如前几篇文章所说,先配置yaml 装置rabbitmq docker pull rabbitmq:3.8.25-management运行rabbitmq ...

November 17, 2021 · 1 min · jiezi

关于c#:手把手教你学Dapr-7-Actors

介绍Actor模式将Actor形容为最低级别的“计算单元”。换句话说,您在一个独立的单元(称为actor)中编写代码,该单元接管音讯并一次解决一个音讯,没有任何并发或线程。 再换句话说,依据ActorId划分独立计算单元后,雷同的ActorId重入要排队,能够了解为lock(ActorId) 注:这里有个反例,就是重入性的引入,这个概念目前还是Preview,它容许同一个链内能够反复进入,判断的规范不止是ActorId这么简略,即本人调本人是被容许的。这个默认是敞开的,须要手动开启,即默认不容许本人调本人。 当您的代码解决一条音讯时,它能够向其余参与者发送一条或多条音讯,或者创立新的参与者。底层运行时治理每个参与者运行的形式、工夫和地点,并在参与者之间路由音讯。 大量的Actor能够同时执行,Actor彼此独立执行。 Dapr 蕴含一个运行时,它专门实现了 Virtual Actor 模式。 通过 Dapr 的实现,您能够依据 Actor 模型编写 Dapr Actor,而 Dapr 利用底层平台提供的可扩展性和可靠性保障。 什么时候用ActorsActor 设计模式非常适合许多分布式系统问题和场景,但您首先应该思考的是该模式的束缚。一般来说,如果呈现以下状况,请思考应用Actors模式来为您的问题或场景建模: 您的问题空间波及大量(数千个或更多)小的、独立且孤立的状态和逻辑单元。您心愿应用不须要与内部组件进行大量交互的单线程对象,包含跨一组Actors查问状态。您的 Actor 实例不会通过收回 I/O 操作来阻塞具备不可预测提早的调用者。Dapr Actor每个Actor都被定义为Actor类型的实例,就像对象是类的实例一样。 例如,可能有一个执行计算器性能的Actor类型,并且可能有许多该类型的Actor散布在集群的各个节点上。每个这样的Actor都由一个Acotr ID惟一标识。 生命周期Dapr Actors是虚构的,这意味着他们的生命周期与他们的内存体现无关。因而,它们不须要显式创立或销毁。Dapr Actors运行时在第一次收到对该Actor ID 的申请时会主动激活该Actor。如果一个Actor在一段时间内没有被应用,Dapr Actors运行时就会对内存中的对象进行垃圾回收。如果稍后须要从新激活,它还将放弃对参与者存在的理解。如果稍后须要从新激活,它还将放弃对 Actor 的所有原有数据。 调用 Actor 办法和揭示会重置闲暇工夫,例如揭示触发将使Actor放弃沉闷。无论Actor是沉闷还是不沉闷,Actor揭示都会触发,如果为不沉闷的Actor触发,它将首先激活演员。Actor 计时器不会重置闲暇工夫,因而计时器触发不会使 Actor 放弃活动状态。计时器仅在Actor处于活动状态时触发。 Reminders 和 Timers 最大的区别就是Reminders会放弃Actor的活动状态,而Timers不会Dapr 运行时用来查看Actor是否能够被垃圾回收的闲暇超时和扫描距离是可配置的。当 Dapr 运行时调用 Actor 服务以获取反对的 Actor 类型时,能够传递此信息。 因为Virtual Actor模型的存在,这种Virtual Actor生命周期形象带来了一些注意事项,事实上,Dapr Actors实现有时会偏离这个模型。 第一次将音讯发送到Actor ID时,Actor被主动激活(导致构建Actor对象)。 通过一段时间后,Actor对象将被垃圾回收。被回收后再次应用Actor ID将导致结构一个新的Actor对象。 Actor 的状态比对象的生命周期长,因为状态存储在 Dapr 运行时配置的状态治理组件中。 注:Actor被垃圾回收之前,Actor对象是会复用的。这里会导致一个问题,在.Net Actor类中,构造函数在Actor存活期间只会被调用一次。散发和故障转移为了提供可扩展性和可靠性,Actor 实例散布在整个集群中,Dapr 依据须要主动将它们从故障节点迁徙到衰弱节点。 ...

November 17, 2021 · 4 min · jiezi

关于c#:C-线程锁和单多线程简单使用

前言:博主昨天在用C#写毕设的时候遇到了一个问题,就是博主的发送命令,须要循环发送,然而要我的接管是有1秒延时,于是就呈现了,我循环发送命令,最初只收到了,最初两条命令的值,于是在一些大佬群里问有没有人会C#的线程锁,失去的回答是这门语言用的人很少,于是博主翻阅材料自学了一下,学了之后就想写进去和大家一起分享一下,除了线程锁,顺带提一下多线程,写的不好,不喜勿喷。 每日一遍,情绪愉悦 1.首先看看咱们的问题 咱们能够看到咱们的循环失去的值会十分疾速的失去答案,然而我在做我的项目的时候须要这个循环函数期待我的接管回答,于是咱们要用到线程锁这方面的常识。 private static object lockObj = new object();//定义线程锁 private int num = 0; private void Test() { while (true) { lock (lockObj)//锁住这个代码块 { num++; string name = Thread.CurrentThread.Name;//获取线程名 textBox1.AppendText(name+"测试:"+num);//这个是TextBox1的追加 textBox1.AppendText(System.Environment.NewLine); Thread.Sleep(2000);//将线程挂起,相当于进行2秒 if (num>=10)//让这个线程执行10次就退出 { break; } } } }这个是应用单线程实现的成果,private void Test(),咱们在定义线程的时候就会在线程Thread(Test)外面定义为Test函数名,代表着,线程跑这个函数,while (true)示意这个线程始终在这里跑直到退锁,lock (lockObj)代表上锁,把这个代码块锁住直到解锁,相当于始终在这运行,只有咱们不退锁,博主只是应用break退出,Sleep代表线程挂起,相当于进行期待了。咱们应用这个能够实现循环函数期待回答。 单线程只须要建设一个线程就能够啦, while (true)能够依据本人的实例来定义线程数量,实践上是线程越多,越快,然而也要思考线程节约。 //单线程 Thread thred1 = new Thread(Test);//定义一个线程 thred1.Name = "thred1";//线程名 thred1.IsBackground = true;//设置为后盾线程就是True thred1.Start();//开始执行这个线程 int n = thred1.ManagedThreadId;//这个线程ID的标识 Console.WriteLine(n);博主再应用多线程操作一下,博主建设了两个线程跑的这个程序,通过看那个name能够看进去,一个Thread1一个Thred2,咱们会发现博主的退出的条件是,大于或等于10就退出,实践上应该在10就进行,然而咱们应用了两个线程,在第二个线程达到的时候咱们的num曾经为10了,线程一曾经退出了,所以到了11,线程二才退出, ...

November 16, 2021 · 1 min · jiezi

关于c#:c执行windows模拟登录

登录代码 /// <summary> /// 登录权限 /// </summary> /// <param name="path"></param> /// <param name="userName"></param> /// <param name="passWord"></param> /// <returns></returns> public bool ConnectState(string path, string userName, string passWord) { bool Flag = false; Process proc = new Process(); try { proc.StartInfo.FileName = "cmd.exe"; proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true; proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.RedirectStandardError = true; proc.StartInfo.CreateNoWindow = true; proc.Start(); string dosLine = "net use " + path + " " + passWord + " /user:" + userName; proc.StandardInput.WriteLine(dosLine); proc.StandardInput.WriteLine("exit"); while (!proc.HasExited) { proc.WaitForExit(1000); } string errormsg = proc.StandardError.ReadToEnd(); proc.StandardError.Close(); if (string.IsNullOrEmpty(errormsg)) { Flag = true; } else { throw new Exception(errormsg); } } catch (Exception ex) { DisplaylistboxMsg(ex.Message); } finally { proc.Close(); proc.Dispose(); } return Flag; }执行登录 private void 登录_Click(object sender, EventArgs e) { bool userbool = ConnectState(@"\\**.**.*.*",User.Text,Pwd.Text); if (userbool) { DisplaylistboxMsg("登录胜利:"+User.Text); } else { DisplaylistboxMsg("登录失败"); } }

November 15, 2021 · 1 min · jiezi

关于c#:手把手教你学Dapr-6-发布订阅

介绍公布/订阅模式容许微服务应用音讯互相通信。生产者或发布者在不晓得哪个应用程序将接管它们的状况下向主题发送音讯。这波及将它们写入输出通道。同样,消费者或订阅者订阅该主题并接管其音讯,而不晓得是什么服务产生了这些音讯。这波及从输入通道接管音讯。两头音讯代理负责将每条音讯从输出通道复制到所有对该音讯感兴趣的订阅者的输入通道。当您须要将微服务彼此拆散时,这种模式特地有用。 Dapr 中的公布/订阅 API 提供至多一次(at-least-once)的保障,并与各种音讯代理和队列系统集成。 您的服务所应用的特定实现是可插入的,并被配置为运行时的 Dapr Pub/Sub 组件。 这种办法打消了您服务的依赖性,从而使您的服务能够更便携,更灵便地适应更改。 Dapr 公布/订阅构建块提供了一个与平台无关的 API 来发送和接管音讯。您的服务将音讯公布到命名主题,并订阅主题以应用这些音讯。 下图显示了一个“shipping”服务和一个“email”服务的例子,它们都订阅了“cart”服务公布的主题。每个服务都会加载指向同一公布/订阅音讯总线组件的公布/订阅组件配置文件,例如 Redis Streams、NATS Streaming、Azure Service Bus 或 GCP Pub/Sub。 下图具备雷同的服务,然而这次显示的是 Dapr 公布 API,它发送“订单”主题和订阅服务上的订单端点,这些主题音讯由 Dapr 公布到。 个性Cloud Events音讯格局为了启用音讯路由并为每条音讯提供额定的上下文,Dapr 应用 CloudEvents 1.0 标准作为其音讯格局。应用程序应用 Dapr 发送到主题的任何音讯都会主动“包装”在 Cloud Events 信封中,应用 datacontenttype 属性的 Content-Type 标头值。 Dapr 实现了以下 Cloud Events 字段: idsourcespecversiontypedatacontenttype (Optional)以下示例显示了 CloudEvent v1.0 中序列化为 JSON 的 XML 内容: { "specversion" : "1.0", "type" : "xml.message", "source" : "https://example.com/message", "subject" : "Test XML Message", "id" : "id-1234-5678-9101", "time" : "2020-09-23T06:23:21Z", "datacontenttype" : "text/xml", "data" : "<note><to>User1</to><from>user2</from><message>hi</message></note>"}音讯订阅Dapr 应用程序能够订阅已公布的主题。 Dapr 容许您的应用程序订阅主题的两种办法: ...

November 15, 2021 · 3 min · jiezi

关于c#:语法特性总结

C# 10已与.NET 6、VS2022一起公布,本文依照.NET的公布程序,依据微软官网文档整顿C#中一些乏味的语法个性。 注:基于不同.NET平台创立的我的项目,默认反对的C#版本是不一样的。上面介绍的语法个性,会阐明引入C#的版本,在应用过程中,须要留神应用C#的版本是否反对对应的个性。C#语言版本控制,可参考官网文档。 匿名函数匿名函数是C# 2推出的性能,顾名思义,匿名函数只有办法体,没有名称。匿名函数应用delegate创立,可转换为委托。匿名函数不须要指定返回值类型,它会依据return语句主动判断返回值类型。 注:C# 3后推出了lambda表达式,应用lambda能够以更简洁的形式创立匿名函数,应尽量应用lambda来创立匿名函数。与lambda不同的是,应用delegate创立匿名函数能够省略参数列表,可将其转换为具备任何参数列表的委托类型。 // 应用delegate关键字创立,无需指定返回值,可转换为委托,可省略参数列表(与lambda不同)Func<int, bool> func = delegate { return true; };主动属性从C# 3开始,当属性拜访器中不须要其它逻辑时,能够应用主动属性,以更简洁的形式申明属性。编译时,编译器会为其创立一个仅能够通过get、set拜访器拜访的公有、匿名字段。应用VS开发时,能够通过snippet代码片段prop+2次tab疾速生成主动属性。 // 属性老写法private string _name;public string Name{ get { return _name; } set { _name = value; }}// 主动属性public string Name { get; set; }另外,在C# 6当前,能够初始化主动属性: public string Name { get; set; } = "Louzi";匿名类型匿名类型是C# 3后推出的性能,它无需显示定义类型,将一组只读属性封装到单个对象中。编译器会主动推断匿名类型的每个属性的类型,并生成类型名称。从CLR的角度看,匿名类型与其它援用类型没什么区别,匿名类型间接派生自object。如果两个或多个匿名对象指定了程序、名称、类型雷同的属性,编译器会把它们视为雷同类型的实例。在创立匿名类型时,如果不指定成员名称,编译器会把用于初始化属性的名称作为属性名称。 匿名类型多用于LINQ查问的select查问表达式。匿名类型应用new与初始化列表创立: // 应用new与初始化列表创立匿名类型var person = new { Name = "Louzi", Age = 18 };Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");// 用于LINQvar productQuery = from prod in products select new { prod.Color, prod.Price };foreach (var v in productQuery){ Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);}LINQC# 3推出了杀手锏性能,查问表达式,即语言集成查问(LINQ)。查问表达式以查问语法示意查问,由一组相似SQL的语法编写的子句组成。 ...

November 14, 2021 · 5 min · jiezi

关于c#:手把手教你学Dapr-5-状态管理

介绍应用状态治理,您的应用程序能够将数据作为键/值对存储在反对的状态存储中。 您的应用程序能够应用 Dapr 的状态治理 API 应用状态存储组件来保留和读取键/值对,如下图所示。例如,通过应用 HTTP POST,您能够保留键/值对,通过应用 HTTP GET,您能够读取键并返回其值。 个性可插拔状态存储Dapr 数据存储被建模为组件,能够在不更改代码的状况下更换它。例如:MySQL、Redis、Azure CosmosDB等。 可配置的状态存储行为Dapr 容许开发人员将额定的元数据附加到状态操作申请中,用以形容申请的解决形式。如: 并发要求一致性要求默认状况下,您的应用程序应假设数据存储最终统一并应用最初写入获胜的并发模式 并发Dapr 反对应用 ETags 的乐观并发管制 (OCC)。当申请状态时,Dapr 总是将 ETag 属性附加到返回的状态。当用户代码尝试更新或删除状态时,应该通过申请注释附加 ETag 以进行更新或通过 If-Match 标头进行删除。只有当提供的 ETag 与状态存储中的 ETag 匹配时,写操作能力胜利。建议您在应用 ETag 时应用重试策略来弥补此类抵触。 如果您的应用程序在写入申请时省略 ETag,则 Dapr 在解决申请时会跳过 ETag 查看。与应用 ETag 的先写赢模式相比,这本质上启用了最初写赢模式。 主动加密Dapr 反对应用程序状态的主动客户端加密,并反对密钥轮换。这是一项预览性能,所有 Dapr 状态存储都反对。 一致性Dapr 反对强一致性和最终一致性,最终一致性作为默认行为。 当应用强一致性时,Dapr 在确认写入申请之前期待所有正本(或指定的仲裁)确认。当应用最终一致性时,一旦底层数据存储承受写入申请,Dapr 就会立刻返回,即便这是单个正本。批量操作Dapr 反对两种类型的批量操作 - 批量(bulk)或多(multi)。 注:bulk与multi的区别在于bulk不是事务性的,multi是事务处理。 Actor状态事务状态存储可用于存储Actor状态。要指定用于Actor的状态存储,请在状态存储组件的元数据局部中将属性 actorStateStore 的值指定为 true。 注:Actors 状态以特定计划存储在事务状态存储中容许统一的查问。所以只能有一个状态存储组件被用于所有的Actor。 间接查问状态存储Dapr 无需任何转换即可保留和检索状态值。您能够间接从底层状态存储查问和聚合状态。 例如,要在 Redis 中获取与应用程序 ID “myApp” 关联的所有状态键,请应用: ...

November 12, 2021 · 2 min · jiezi

关于c#:如何完成复杂查询的动态构建

有的时候,你须要动静构建一个比较复杂的查问条件,传入数据库中进行查问。而条件自身可能来自前端申请或者配置文件。那么这个时候,表达式树,就能够帮忙到你。本文咱们将通过几个简短的示例来理解如何实现这些操作。 微软MVP实验室研究员 你也可能接到过这些需要: (图片从模型进行查问)(基于配置查问) 明天咱们看看表达式树如何实现这些需要。 Where当中能够传入固定的条件以下是一个简略的单元测试用例。接下来,咱们将这个测试用例改的面目全非。 [Test]public void Normal(){ var re = Enumerable.Range(0, 10).AsQueryable() // 0-9 .Where(x => x >= 1 && x < 5).ToList(); // 1 2 3 4 var expectation = Enumerable.Range(1, 4); // 1 2 3 4 re.Should().BeEquivalentTo(expectation);}Queryable中的Where就是一种表达式树因为是 Queryable 的关系,所以Where当中的其实是一个表达式,那么咱们把它独自定义进去,顺便水一下文章的长度。 [Test]public void Expression00(){ Expression<Func<int, bool>> filter = x => x >= 1 && x < 5; var re = Enumerable.Range(0, 10).AsQueryable() .Where(filter).ToList(); var expectation = Enumerable.Range(1, 4); re.Should().BeEquivalentTo(expectation);}表达式能够通过Lambda隐式转换Expression 右侧是一个 Lambda ,所以能够捕捉上下文中的变量。这样你便能够把 minValue 和 maxValue 独自定义进去。于是乎你能够从其余中央来获取 minValue 和 maxValue 来扭转 filter。 ...

November 10, 2021 · 5 min · jiezi

关于c#:手把手教你学Dapr-4-服务调用

介绍通过应用服务调用,您的应用程序能够应用规范的gRPC或HTTP协定与其余应用程序牢靠、平安地通信。 为什么不间接用HttpClientFactory呢先问几个问题: 如何发现和调用不同服务的办法如何平安地调用其余服务,并对办法利用访问控制如何解决重试和瞬态谬误如何应用分布式跟踪指标来查看调用图来诊断生产中的问题此时你会发现这些事件HttpClientFactory没有帮你实现,而在微服务中这些又是必不可少的能力,接下来看看服务调用都做了什么 服务调用如何工作的先看一下两个服务之间的调用程序 服务A 向服务B发动一个HTTP/gRPC的调用。调用转到了本地的Dapr sidecarDapr应用名称解析组件发现服务B的地位Dapr 将音讯转发至服务 B的 Dapr sidecar 注: Dapr sidecar之间的所有调用都通过gRPC来进步性能。 仅服务与 Dapr sidecar之间的调用能够是 HTTP或gRPC 服务B 的 Dapr sidecar将申请转发至服务B 上的特定端点 (或办法) 。 服务B 随后运行其业务逻辑代码服务B 发送响应给服务A。 响应将转至服务B 的Dapr sidecarDapr 转发响应至服务A 的 Dapr sidecar服务 A 接管响应命名空间作用域默认状况下,调用同一个命名空间的其余服务能够间接应用AppID(假如是:nodeapp) localhost:3500/v1.0/invoke/nodeapp/method/neworder服务调用也反对跨命名空间调用,在所有受反对的宿主平台上,Dapr AppID遵循FQDN格局,其中包含指标命名空间。 FQDN:(Fully Qualified Domain Name)全限定域名:同时带有主机名和域名的名称。(通过符号“.”) 例如:主机名是bigserver,域名是mycompany.com,那么FQDN就是bigserver.mycompany.com 注:FQDN是通过符号.来拼接域名的,这也就解释了AppID为什么不能用符号.,这里不记住的话,应该会有不少小伙伴会踩坑 比方.net开发者习惯用 A.B.C 来命名我的项目,但AppID须要把.换成-且所有单词最好也变成小写 (a-b-c),倡议把它变成约定恪守 比方调用命名空间:production,AppID:nodeapp localhost:3500/v1.0/invoke/nodeapp.production/method/neworder这在K8s集群中的跨名称空间调用中特地有用 服务间安全性通过托管平台上的互相(mTLS)身份验证,包含通过Dapr Sentry服务的主动证书转移,能够确保Dapr应用程序之间的所有调用的平安。 下图显示了自托管应用程序的状况。 访问控制应用程序能够管制哪些其余应用程序能够调用它们,以及通过拜访策略受权它们做什么。 这使您可能限度具备个人信息的敏感应用程序不被未经受权的应用程序拜访,并联合服务到服务的平安通信,提供了软多租户部署。 具体的访问控制后续章节会介绍重试在调用失败和瞬态谬误的状况下,服务调用执行主动重试,并在回退时间段内执行。 注:主动重试,默认是开启的,能够关。但如果不关且业务又不反对幂等是很危险的。倡议服务的接口要设计反对幂等,这在微服务里也是一个标配的抉择。 导致重试的谬误有: 网络谬误,包含端点不可用和回绝连贯。 因为在调用/被调用的Dapr sidecars上更新证书而导致的身份验证谬误。 每次呼叫重试的回退距离为1秒,最多为3次。 通过gRPC与指标Sidecar连贯的超时工夫为5秒 可插拔的服务发现Dapr能够在各种托管平台上运行。 为了启用服务发现和服务调用,Dapr应用可插拔的名称解析组件。 例如,K8s名称解析组件应用K8s DNS服务来解析集群中运行的其余应用程序的地位。 自托管机器能够应用mDNS名称解析组件。 Consul名称解析组件能够在任何托管环境中应用,包含K8s或自托管环境 ...

November 3, 2021 · 2 min · jiezi

关于c#:手把手教你学Dapr-3-使用Dapr运行第一个Net程序

留神: 文章中提到的命令行工具即是Windows Terminal/PowerShell/cmd其中的一个,举荐应用Windows Terminal 运行命令行工具的时候倡议以管理员身份,防止踩坑 为了保障操作顺畅,倡议应用PowerShell先执行一下set-ExecutionPolicy RemoteSigned 装置Docker因为Dapr CLI默认会在Docker内启动 redis、zipkin、placement。 当然这些也不是必须要装置的,只是举荐装置能够体验Dapr的残缺能力,不便后续章节的学习。 下载并装置Docker Desktop https://www.docker.com/produc...装置WSL2,应用命令行工具执行命令 wsl --instal如果不能应用wsl间接装置的话能够手动装置,运行PowerShell并执行上面两句命令dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart如果你再次遇到谬误提醒:0x800f080c 性能名称 VirtualMachinePlatform 未知。请保障本人的操作系统版本在Windows 10 build 18917以上重启电脑后下载WSL2内核 https://wslstorestorage.blob....运行命令行工具,设置默认应用WSL2 wsl --set-default-version 2下载Ubuntu 20.04 https://www.microsoft.com/sto...设置Docker应用WSL2 你“可能”须要一个小工具不能说的机密,看文件名猜性能 https://github.com.cnpmjs.org...装置Dapr CLI官网解释:Dapr CLI 是您用于各种 Dapr 相干工作的次要工具。 您能够应用它来运行一个带有Dapr sidecar的应用程序, 以及查看sidecar日志、列出运行中的服务、运行 Dapr 仪表板。 CLI是必须要装置吗?其实也不是,但老手不倡议去体验这些骚操作。后续文章会解说脱离dapr cli工作。运行Windows Terminal或PowerShell,执行命令,这里要急躁期待一下 iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex如果是cmd执行上面命令: powershell -Command "iwr -useb https://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"验证装置,从新关上命令行工具执行命令dapr,看到上面的提醒即装置正确 __ ____/ /___ _____ _____ / __ / __ '/ __ \/ ___/ / /_/ / /_/ / /_/ / / \__,_/\__,_/ .___/_/ /_/===============================Distributed Application RuntimeUsage: dapr [command]Available Commands: completion Generates shell completion scripts components List all Dapr components. Supported platforms: Kubernetes configurations List all Dapr configurations. Supported platforms: Kubernetes dashboard Start Dapr dashboard. Supported platforms: Kubernetes and self-hosted help Help about any command init Install Dapr on supported hosting platforms. Supported platforms: Kubernetes and self-hosted invoke Invoke a method on a given Dapr application. Supported platforms: Self-hosted list List all Dapr instances. Supported platforms: Kubernetes and self-hosted logs Get Dapr sidecar logs for an application. Supported platforms: Kubernetes mtls Check if mTLS is enabled. Supported platforms: Kubernetes publish Publish a pub-sub event. Supported platforms: Self-hosted run Run Dapr and (optionally) your application side by side. Supported platforms: Self-hosted status Show the health status of Dapr services. Supported platforms: Kubernetes stop Stop Dapr instances and their associated apps. . Supported platforms: Self-hosted uninstall Uninstall Dapr runtime. Supported platforms: Kubernetes and self-hosted upgrade Upgrades a Dapr control plane installation in a cluster. Supported platforms: KubernetesFlags: -h, --help help for dapr -v, --version version for daprUse "dapr [command] --help" for more information about a command.初始化Dapr应用命令行工具执行命令 ...

November 3, 2021 · 3 min · jiezi

关于c#:手把手教你学Dapr-2-必须知道的概念

Sidecar 边车Dapr API提供Http和gRPC两种通信形式。 运行形式则能够是容器也能够是过程(Windows开发举荐应用Self Hosted,后续会解释)。 这样的益处是与运行环境无关,且独立运行不须要利用蕴含Dapr运行时的代码。只须要通过SDK集成即可,这使得Dapr与利用的逻辑拆散。 Building blocks 构建块官网解释:可通过规范HTTP或gRPC api拜访的模块化最佳实际 艰深一点来说,就是API目前反对的构建块如下,但1.5很快会出一个新的Configuration API(从这个新的API又印证了构建块的实质),由阿里-敖小剑牵头整顿的 Github Issue: https://github.com/dapr/dapr/... 这个提案很长,很波折。认真看会发现中外开发大环境下的一些思维碰撞。微软绝对激进,阿里绝对激进但也更求实。最终长达几个月的强烈探讨下定版。 期间自己也有幸与阿里-敖小剑和阿里-典礼(Layotto的研发同学,Layotto兼容Dapr协定,是蚂蚁在做)开过语音会议一起聊过对于Configuration API的一些设计问题。 服务调用状态治理公布订阅绑定Actor(这个不倡议翻译回中文)可观测性平安 Components 组件官网解释:被用于构建块和应用程序的模块化性能 Dapr 应用模块化设计,将性能作为组件来提供。 每个组件都有接口定义。 所有组件都是可插拔的,因而您能够将组件换为另一个具备雷同接口的组件。 联合构建块来看,组件有接口定义。而构建块则通过接口将组件的性能串联起来 基于对Dapr设计的了解,咱们的MASA Framework也定义出了 BuildingBlocks 和 Contrib,与dapr会有些许不同 起因如下: 由BuildingBlocks定义规范、串业务流程让Contrib变成咱们的最佳实际,并容许开发从新定义BuildingBlocks的具体实现,在保障性能残缺的前提下提供更合乎业务场景的性能又有参考代码聚焦外围代码稳定性,提供单元测试覆盖率保障,共享公众智慧组件与构建块并不是一一对应的,组件能够被不同的构建块复用,比方Actor构建块内的状态治理也是用的状态存储组件 状态存储服务发现中间件公布订阅代理绑定密钥存储Configuration 配置官网解释:变更Dapr Sidecar或全局Dapr零碎服务的行为 配置定义和部署模式为YAML文件 在官网文档的Component sepcs能够看到每个组件提供了多少种实现,每个实现个性反对状况 除此之外不同组件的配置文件格式也是包罗万象 官网文档对于组件配置的解说十分具体,这里举个例子,Redis状态治理的配置文件格式 你须要变更的局部曾经用<>和 # 做了标记 参考自:https://docs.dapr.io/referenc...apiVersion: dapr.io/v1alpha1kind: Componentmetadata: name: <NAME> namespace: <NAMESPACE>spec: type: state.redis version: v1 metadata: - name: redisHost value: <HOST> - name: redisPassword value: <PASSWORD> - name: enableTLS value: <bool> # Optional. Allowed: true, false. - name: failover value: <bool> # Optional. Allowed: true, false. - name: sentinelMasterName value: <string> # Optional - name: maxRetries value: # Optional - name: maxRetryBackoff value: # Optional - name: ttlInSeconds value: <int> # OptionalObservability 可观测性官网解释:通过跟踪、指标、日志和健康状况监督利用 ...

November 1, 2021 · 1 min · jiezi

关于c#:c文件压缩解压

c#文件压缩/解压压缩private void skinButton1_Click(object sender, EventArgs e) { FilesUploadFor.ZipDirectory(foldertozip.Text,zipedfilename.Text); filesUploadFor.DisplaylistboxMsg("压缩实现"); }ZipDirectory压缩用的是库函数 /// <summary> /// 压缩文件夹 /// </summary> /// <param name="folderToZip">须要压缩的文件夹</param> /// <param name="zipedFileName">压缩后的Zip残缺文件名</param> public static void ZipDirectory(string folderToZip, string zipedFileName) { ZipDirectory(folderToZip, zipedFileName, string.Empty, true, string.Empty, string.Empty, true); } /// <summary> /// 压缩文件夹 /// </summary> /// <param name="folderToZip">须要压缩的文件夹</param> /// <param name="zipedFileName">压缩后的Zip残缺文件名(如D:\test.zip)</param> /// <param name="isRecurse">如果文件夹下有子文件夹,是否递归压缩</param> /// <param name="password">解压时须要提供的明码</param> /// <param name="fileRegexFilter">文件过滤正则表达式</param> /// <param name="directoryRegexFilter">文件夹过滤正则表达式</param> /// <param name="isCreateEmptyDirectories">是否压缩文件中的空文件夹</param> public static void ZipDirectory(string folderToZip, string zipedFileName, string password, bool isRecurse, string fileRegexFilter, string directoryRegexFilter, bool isCreateEmptyDirectories) { FastZip fastZip = new FastZip(); fastZip.CreateEmptyDirectories = isCreateEmptyDirectories; fastZip.Password = password; fastZip.CreateZip(zipedFileName, folderToZip, isRecurse, fileRegexFilter, directoryRegexFilter); }解压缩 private void skinButton2_Click(object sender, EventArgs e) { filesUploadFor.UnZip(zipedfilename.Text,""); filesUploadFor.DisplaylistboxMsg("解压缩实现"); }UnZip解压用的是库函数 ...

November 1, 2021 · 2 min · jiezi

关于c#:c文件上传下载功能实现

NuGet 装置SqlSugarModel文件下新建 DbContext 类 public class DbContext { public DbContext() { Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "server=localhost;uid=root;pwd=woshishui;database=test", DbType = DbType.MySql, InitKeyType = InitKeyType.Attribute,//从个性读取主键和自增列信息 IsAutoCloseConnection = true,//开启主动开释模式和EF原理一样我就不多解释了 }); //调式代码 用来打印SQL Db.Aop.OnLogExecuting = (sql, pars) => { Console.WriteLine(sql + "rn" + Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value))); Console.WriteLine(); }; } //留神:不能写成动态的,不能写成动态的 public SqlSugarClient Db;//用来处理事务多表查问和简单的操作 public SimpleClient<uploading> uploadingdb { get { return new SimpleClient<uploading>(Db); } }//用来解决Student表的罕用操作 }uploading实体类[SugarTable("uploading")] public class uploading { //指定主键和自增列,当然数据库中也要设置主键和自增列才会无效 [SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int id { get; set; } public string name { get; set; } public string path { get; set; } }UploadingManager class UploadingManager : DbContext { public List<uploading> Query() { try { List<uploading> data = Db.Queryable<uploading>() .Select(f => new uploading { name = f.name, path = f.path }) .ToList(); return data; } catch (Exception e) { Console.WriteLine(e); throw; } } public List<string> GetName(string name) { List<string> data = Db.Queryable<uploading>() .Where(w=>w.name== name) .Select(f => f.path) .ToList(); return data; } }窗体加载读取到数据库字段name并赋值 ...

October 29, 2021 · 2 min · jiezi

关于c#:NETCore31-使用Jwt保护api

摘要本文演示如何向无效用户提供jwt,以及如何在webapi中应用该token通过JwtBearerMiddleware中间件对用户进行身份认证。 认证和受权区别?首先咱们要弄清楚认证(Authentication)和受权(Authorization)的区别,免得混同了。认证是确认的过程中你是谁,而受权围绕是你被容许做什么,即权限。显然,在确认容许用户做什么之前,你须要晓得他们是谁,因而,在须要受权时,还必须以某种形式对用户进行身份验证。 什么是JWT?依据维基百科的定义,JSON WEB Token(JWT),是一种基于JSON的、用于在网络上申明某种主张的令牌(token)。JWT通常由三局部组成:头信息(header),音讯体(payload)和签名(signature)。 头信息指定了该JWT应用的签名算法: header = '{"alg":"HS256","typ":"JWT"}'HS256示意应用了HMAC-SHA256来生成签名。 音讯体蕴含了JWT的用意: payload = '{"loggedInAs":"admin","iat":1422779638}'//iat示意令牌生成的工夫未签名的令牌由base64url编码的头信息和音讯体拼接而成(应用"."分隔),签名则通过公有的key计算而成: key = 'secretkey' unsignedToken = encodeBase64(header) + '.' + encodeBase64(payload) signature = HMAC-SHA256(key, unsignedToken)最初在未签名的令牌尾部拼接上base64url编码的签名(同样应用"."分隔)就是JWT了: token = encodeBase64(header) + '.' + encodeBase64(payload) + '.' + encodeBase64(signature)# token看起来像这样: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHIJWT经常被用作爱护服务端的资源(resource),客户端通常将JWT通过HTTP的Authorization header发送给服务端,服务端应用本人保留的key计算、验证签名以判断该JWT是否可信: Authorization: Bearer eyJhbGci*...<snip>...*yu5CSpyHI筹备工作应用vs2019创立webapi我的项目,并且装置nuget包 Microsoft.AspNetCore.Authentication.JwtBearerStartup类ConfigureServices 增加认证服务 services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }).AddJwtBearer(options => { options.SaveToken = true; options.RequireHttpsMetadata = false; options.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true, ValidateAudience = true, ValidAudience = "https://xx", ValidIssuer = "https://xx", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SecureKeySecureKeySecureKeySecureKeySecureKeySecureKey")) }; });Configure 配置认证中间件 ...

October 29, 2021 · 1 min · jiezi

关于c#:C-利用委托事件进行窗体间的传值

定义委托定义了一个参数是string ,无返回值的委托,名为 SendMessageToChildForms。 public delegate void SendMessageToChildForms(string s);委托实例化实质就是实例化了一个事件event public event SendMessageToChildForms smtcf_event;执行的办法public void ToShowGetMessage(string s){ this.lb_收到内容.Text=s;}绑定办法在一实例化的一个委托事件上绑定子窗体的具体方法 Parameter frm_child = new Parameter(); smtcf_event += frm_child.ToShowGetMessage; frm_child.Show();触发委托 if (smtcf_event != null) //判断委托事件是否为空,如果委托不为空才执行 { smtcf_event.Invoke("12212");// 能够省略Invoke 简写为smtcf(this.textBox1.Text.Trim()); }

October 28, 2021 · 1 min · jiezi

关于c#:手把手教你学Dapr-1-Net开发者的大时代

Dapr全称Distributed Application Runtime,分布式应用运行时 Dapr的口号简化云原生利用开发,聚焦在利用的外围逻辑,让代码简略、可移植 Dapr的指标最佳实际的构建块任何语言或框架一致性,可移植,凋谢的API驳回规范可扩大和可插拔的组件与平台无关(本地,云计算,边缘计算等)社区驱动,供应商(厂商)中立Dapr的设计思路这里首先要先了解几个问题,而后再看Dapr如何解决这些问题的 以下材料都有英文原图,中文翻译为集体了解,英文好的小伙伴能够间接看原图。微服务为什么很难开发者要构建本人的运行时解决分布式应用问题运行时反对的开发语言无限,且有严格控制的个性(性能)汇合运行时的可移植性无限,个别只反对特定的基础架构平台 分布式应用的需要内容引自 Multi-Runtime Microservices Architecture https://www.infoq.com/article...留神:二级内容不与图片对应,把性能组合成场景 生命周期 更快的公布周期自动化部署从谬误中复原自动化伸缩网络 服务发现跟踪与遥测(可观测性)信息替换:点对点、公布/订阅,智能路由状态 服务编排、工作流分布式单例(Actor)长期调度(Cron)幂等性有状态谬误复原缓存绑定 转换协定反对不同的音讯替换模式:轮询、事件驱动、申请/应答等转换音讯格局执行自定义谬误复原过程平安机制 传统中间件和云原生比照传统中间件以各种SDK的形式提供能力,而云原生平台则通过各种外围的Runtime,目前来看比拟乏味的是,大家不谋而合的抉择了Sidecar。 多运行时微服务边界K8s和容器在多语言应用程序的生命周期治理方面获得了微小的飞跃,并为将来的翻新奠定了根底Service Mesh在K8s上失去了改良,具备先进的网络性能,并开始深刻应用程序Knative通过疾速伸缩来关注无服务器的工作负载,解决了服务编排和事件驱动的绑定需要Dapr以K8s、Knative和Service Mesh的思维为根底,深入研究利用程序运行时,解决有状态的工作负载、绑定和集成需要,充当古代分布式中间件 次要分为3个局部,K8s、机甲运行时(网关、Dapr + Knative)、业务逻辑。 Dapr的呈现能够让开发者更专一于业务逻辑,而业务逻辑则作为服务运行时。 多运行时的益处业务逻辑和一直减少的分布式系统关注点之间的松耦合。 业务逻辑常常变动,取决于业务优先级。 而分布式原语则由软件供应商提供,作为库、容器、服务来应用。这些代码会依据供应商优先级、公布周期、安全补丁、开源治理规定等而变动。 他们相互看不到对方,也无法控制对方。 Dapr的劣势:Any language, anywhere与语言无关,与平台无关 分布式应用运行时官网解释 帮忙开发人员构建事件驱动的、弹性的分布式应用程序。 无论是在本地、云中还是在边缘设施上,都能够帮忙你解决构建微服务所带来的挑战,并放弃代码与平台无关。能够看到Dapr更具象化了 与应用程序通过HTTP和gRPC通信外部有一些构建块运行在云上 Dapr与服务网格开发者更聚焦在代码层面,通过SDK(图中没有标注)与dapr的构建块通信,面向localhost编程运维更关注安全性、可观测性、健壮性等问题上。而流量管控的局部,dapr(可能是临时的)没有。 Sidecar的世界利用于Sidecar通信是通过Dapr API(曾经被封装成不同开发语言的SDK),这个过程中通过OpenTelemetry反对了可观测性(即跟踪、日志、指标)利用之间通过Sidecar通信,反对mTLS,这个指服务调用(即Service Invocation)Sidecar 之间通过gRPC(图片中没有显示),Bindings,Pub/Sub都能够通信可观测性无处不在,通过Prometheus、Zipkin、Fluentd等,可视化OpenTelemetry中的局部数据但目前据我所知没有一个能够对立接管残缺OpenTelemetry的,如果有的话欢送纠错。状态治理也是由Sidecar代理的 对于.Net的意义.Net SDK是微软亲儿子,让.Net和Java一起在新起点站在了同一起跑线分布式应用运行时给.Net的新架构带来了新的思路和时机减速.Net技术栈的更新迭代共享开源生态咱们正在口头,新的框架、新的生态咱们的指标是自在的、易用的、可塑性强的、功能丰富的、强壮的。 所以咱们借鉴Building blocks的设计理念,正在做一个新的框架MASA Framework,它有哪些特点呢? 原生反对Dapr,且容许将Dapr替换成传统通信形式架构不限,单体利用、SOA、微服务都反对反对.Net原生框架,升高学习累赘,除特定畛域必须引入的概念,保持不造新轮子丰盛的生态反对,除了框架以外还有组件库、权限核心、配置核心、故障排查核心、报警核心等一系列产品外围代码库的单元测试覆盖率90%+开源、收费、社区驱动还有什么?咱们在等你,一起来探讨通过几个月的生产我的项目实际,已实现POC,目前正在把之前的积攒重构到新的开源我的项目中目前源码已开始同步到Github(文档站点在布局中,会缓缓欠缺起来): MASA.BuildingBlocks MASA.Contrib MASA.Utils MASA.EShop BlazorComponent MASA.Blazor QQ群:7424099 微信群:加技术经营微信(MasaStackTechOps),备注来意,邀请进群 (文章转载自:鬼谷子)

October 27, 2021 · 1 min · jiezi

关于c#:netCore30webapi到前端vue后端

创立api我的项目 创立实现启动F5!! 如图 数据库我用的是mysql 用efcore框架进行数据操作 开发环境:Win10 + VS2019 Mysql服务器版本:8.0.16下载并装置插件(必备)MySQL-Connector-net-6.9.12MySQL for Visual Studio 2.0.5用Nuget形式装置MySql.Data.Entity-6.9.12(MySql.Data.EntityFrameworkCore.Design!!两种都试过没问题,后面一种会报提醒不兼容),MySql.Data-6.9.12 MySql.Data.EntityFrameworkCore留神!!! 装置的2个dll版本号必须统一以及对应MySQL-Connector-net版本雷同 根目录新建Models文件创立实体类 gj public class gj { // <summary> /// 主键 /// </summary> public int id { get; set;}/// <summary>/// 题目/// </summary>public string method { get; set;}/// <summary>/// 内容/// </summary>public string text { get; set;}/// <summary>/// 状态 1失常 0删除/// </summary>public string type { get; set;}}public class DbModel:DbContext {public DbSet<gj> gj { set; get;}//protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)// => optionsBuilder.UseMySQL(@"Server=localhost;database=testapp;uid=root;pwd=woshishui");public DbModel(DbContextOptions<DbModel> options) : base(options) {}}appsettings.json配置数据连贯 ...

October 26, 2021 · 1 min · jiezi

关于c#:c使用SoundPlayer播放wav格式音频

应用System.Media名称空间下的类SoundPlayer 能够让咱们很不便的播放wav波形声音文件。SoundPlayer类其实就是对winmm.dll文件中API函数的封装。 SoundPlayer类的应用很简略。如下: SoundPlayer player = new SoundPlayer();player.SoundLocation = "音乐文件名";player.Load();player.Play();其中Play办法是异步办法,会在另一个线程中播放。如果咱们有时候须要等声音播放结束之后再进行下一步操作。即声音播放须要阻塞以后线程。就能够应用PlaySync()办法SoundPlayer类的毛病:只能播放wav文件;在winxp下播放文件比拟大或位率比拟高的状况,PlaySync同步播放会有播放不齐全的问题。这个问题的产生是因为winmm.dll的版本问题引起的。在xp下winmm.dll的版本是5。在win7下是6。win7下就没有问题。如果要解决在xp下播放不齐全的问题。能够应用xp下的录音机关上声音文件,把声音文件另存为7kbit/s的位率格局,但这样声音成果就很差了。实现援用System.Media名称空间下的类SoundPlayer SoundPlayer player = new SoundPlayer();办法调用Play();public void Play() { **player.SoundLocation** = @".x0pbk-swz4q.wav"; //读取音频文件 **player.Load(); **//同步模式 **player.Play(); ** if (MessageBox.Show("播放音樂中,通过旋转耳机上的旋钮测试音量,若聲音播放失常则选是,反之否", "提醒", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No) { DisplaylistboxMSG("Headset測試結果為異常"); } else { DisplaylistboxMSG("Headset測試結果為失常"); } player.Stop(); //进行播放 player.Dispose();}

October 26, 2021 · 1 min · jiezi

关于c#:cNAudio-录音功能实现

在网上找了很多相似录音教程成果都不好,或基本不能录音,代码由网上借鉴批改(残缺实现录音播放性能) NAudioNAudio为.NET平台下的开源库,采纳ML-PL协定,开源地址:https://github.com/naudio/NAudio。 NAudio功能强大,且其入门容易。弱小在于:它反对许多音频操作,可实现多种API播放与录制、多种不同音频格式、音频格式转换(重采样、位深、声道等)、音频编码、多通道播放、音频成果解决等等(具体介绍能够看Github readme)。 新建RecordController首先新建援用类 RecordController public class RecordController { public WaveIn mWavIn; public WaveFileWriter mWavWriter; /// <summary> /// 开始录音 /// </summary> /// <param name="filePath"></param> public void StartRecord(string filePath) { mWavIn = new WaveIn(); mWavIn.DataAvailable += MWavIn_DataAvailable; // mWavIn.RecordingStopped += MWavIn_RecordingStopped; 有抵触 mWavWriter = new WaveFileWriter(filePath, mWavIn.WaveFormat); mWavIn.StartRecording(); } /// <summary> /// 进行录音 /// </summary> public void StopRecord() { mWavIn?.StopRecording(); mWavIn?.Dispose(); mWavIn = null; mWavWriter?.Close(); mWavWriter = null; } //这个办法在调用敞开时会有抵触 private void MWavIn_RecordingStopped(object sender, StoppedEventArgs e) { //mWavIn?.Dispose(); //mWavIn = null; //mWavWriter?.Close(); //mWavWriter = null; } private void MWavIn_DataAvailable(object sender, WaveInEventArgs e) { mWavWriter.Write(e.Buffer, 0, e.BytesRecorded); int secondsRecorded = (int)mWavWriter.Length / mWavWriter.WaveFormat.AverageBytesPerSecond; }}应用在主界面援用 RecordController record = new RecordController(); ...

October 26, 2021 · 1 min · jiezi

关于c#:c获取文件夹目录下文件信息

应用程序可能只容许用户抉择文佳夹而非文件,,在增加时,只有抉择增加这个文佳夹,就是只抉择了文佳夹,而不是文件,这就要用到FloderBrowertDIalog控件对话框 FolderBrowserDialog控件对话框的罕用属性 Description 在对话框中提供描述性的音讯 RootFloder 指定对话框开始浏览的根文件夹 SelectedPath 指定用户所选的文件夹 ShowNewFloderButton 指定新建文件夹按钮是否显示在对话框中 private void button1_Click(object sender, System.EventArgs e) { //浏览文件夹 this.folderBrowserDialog1.ShowDialog(); if(this.folderBrowserDialog1.SelectedPath.Trim()!="") this.textBox1.Text=this.folderBrowserDialog1.SelectedPath.Trim();}private void button2_Click(object sender, System.EventArgs e) { //显示指定文件夹下的文件 if(this.textBox1.Text.Trim()=="") return; this.listBox1.Items.Clear(); string[] MyFiles=System.IO.Directory.GetFiles(this.textBox1.Text); this.listBox1.Items.AddRange(MyFiles); //foreach(string File in MyFiles) // this.listBox1.Items.Add(File);}======================================================================================= 本文链接:原创文章转载请注明

October 26, 2021 · 1 min · jiezi

关于c#:winform-启动外部程序

//class外面放入这段代码[DllImport("shell32.dll")]public static extern int ShellExecute(IntPtr hwnd, StringBuilder lpszOp, StringBuilder lpszFile, StringBuilder lpszParams, StringBuilder lpszDir, int FsShowCmd);//须要关上的中央插入此段代码ShellExecute(IntPtr.Zero, new StringBuilder("Open"), new StringBuilder("test.exe"), new StringBuilder(""), new StringBuilder(@"C:\文件夹名"), 1);

October 26, 2021 · 1 min · jiezi

关于c#:c利用定时器自动备份数据库mysql

援用dllmysql.data.dll是MySQL数据库中一款必备的驱动文件,次要用于.net编程和MySQL数据库的连贯,蕴含不同版本的mysql.data.dll,反对32位和64位零碎 MySqlBackup疾速备份或还原 MySql数据库,原理是应用MySqlBackup.dll 中的备份和还原办法,将数据库的信息转换为对应的sql语句,而后进行解决。 MySql.Data.dllMySqlbackup.dll动态类新建一个连贯字符串动态类 public static class mysql{public static string constr = "database=test;Password=明码;user ID=root;server=ip地址";public static MySqlConnection conn = new MySqlConnection(constr);}定时器启动winform timer1.Interval = 1000; //代表一秒运行一次timer1.Enabled = true; //启动备份代码利用winform窗体 timer定时器控件 C#调用MySqlBackup.dll 备份Mysql数据库 private void timer1_Tick(object sender, EventArgs e) { if (booql) { booql = false; if (DateTime.Now.Hour == 10 && DateTime.Now.Minute == 00) //工夫10点 { string time1 = System.DateTime.Now.ToString("d").Replace("/", "-"); string file = ".//mysql/" + time1 + "_test.sql"; using (MySqlCommand cmd = new MySqlCommand()) { using (MySqlBackup mb = new MySqlBackup(cmd)) { cmd.Connection = mysql.conn; mysql.conn.Open(); mb.ExportToFile(file); mysql.conn.Close(); MessageBox.Show("数据库已主动备份本地"); } } } }}

October 26, 2021 · 1 min · jiezi

关于c#:mysql数据库备份还原

援用dllMySql.Data.dll, MySqlbackup.dll建动态类public static class mysql{public static string constr = "database=test;Password=明码;user ID=root;server=ip地址";public static MySqlConnection conn = new MySqlConnection(constr);}备份代码DialogResult result = MessageBox.Show("备份门路默认在以后程序下", "提醒", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (result == DialogResult.Yes) { string time1 = System.DateTime.Now.ToString("d").Replace("/", "-"); string file = ".//mysql/" + time1 + "_test.sql"; using (MySqlCommand cmd = new MySqlCommand()) { using (MySqlBackup mb = new MySqlBackup(cmd)) { cmd.Connection = mysql.conn; mysql.conn.Open(); mb.ExportToFile(file); mysql.conn.Close(); MessageBox.Show("已备份"); } }} else { return;}还原代码string file = textBox1.Text;if (file == "") { MessageBox.Show("不能为空"); return;}DialogResult result = MessageBox.Show("确定还原吗?", "还原", MessageBoxButtons.YesNo, MessageBoxIcon.Question);if (result == DialogResult.Yes) { try { using (MySqlCommand cmd = new MySqlCommand()) { using (MySqlBackup mb = new MySqlBackup(cmd)) { cmd.Connection = mysql.conn; mysql. conn.Open(); mb.ImportFromFile(file); mysql. conn.Close(); MessageBox.Show("已还原"); } } } catch (Exception ex) { MessageBox.Show(ex.Message); }} else { return;}

October 26, 2021 · 1 min · jiezi

关于c#:尝新体验ASPNET-Core-6预览版本中发布的最小Web-APIminimal-APIS新特性

本文首发于 码友网--《创立API服务最小只有4行代码!!!尝新体验ASP.NET Core 6预览版本中公布的最小Web API(minimal APIS)新个性》 概述.NET开发者们大家好,我是Rector。 几天前(美国工夫2021年8月10日),微软官网公布了.NET 6的第7个预览版,其中蕴含了很多新的个性和性能,比方: 优化最小Web API(minimal APIS)模板为生成罕用HTTP响应增加了IResult的接口实现最小操作反对Request,Response等优化了最小主机、模板从查问字符串中获取Blazor组件参数...本文咱们次要来体验最小Web API的性能和个性。最小Web API的目标次要是帮忙C#(或者F#)后端开发者疾速创立微服务项目或者HTTP API服务。 与之前的ASP.NET Core Web API相比,最小Web API在启动模板和框架结构上都有些不同。最小Web API的模板相当简洁,你几须要写4行代码便可实现一个最小Web API我的项目的搭建。 上面咱们从头开始创立一个最小Web API我的项目并体验。 筹备工作在开始创立最小Web API之前,请确保开发环境中已装置了.NET SDK 6.0.100-preview.7.21379.14(以后最新的.NET SDK版本),在Windows操作系统中,你能够应用.NET Cli命令来查看,比方: dotnet --info运行后果如下图: 如果须要查看以后环境已装置的.NET模板,运行如下命令: dotnet new -l运行后果如下: Template Name Short Name Language Tags-------------------------------------------- ------------------- ---------- --------------------------ASP.NET Core Empty web [C#],F# Web/EmptyASP.NET Core gRPC Service grpc [C#] Web/gRPCASP.NET Core Web API webapi [C#],F# Web/WebAPIASP.NET Core Web App razor,webapp [C#] Web/MVC/Razor PagesASP.NET Core Web App (Model-View-Controller) mvc [C#],F# Web/MVCASP.NET Core with Angular angular [C#] Web/MVC/SPAASP.NET Core with React.js react [C#] Web/MVC/SPAASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPABlazor Server App blazorserver [C#] Web/BlazorBlazor WebAssembly App blazorwasm [C#] Web/Blazor/WebAssembly/PWAClass Library classlib [C#],F#,VB Common/LibraryConsole Application console [C#],F#,VB Common/Consoledotnet gitignore file gitignore ConfigDotnet local tool manifest file tool-manifest Configglobal.json file globaljson ConfigMSTest Test Project mstest [C#],F#,VB Test/MSTestMVC ViewImports viewimports [C#] Web/ASP.NETMVC ViewStart viewstart [C#] Web/ASP.NETNuGet Config nugetconfig ConfigNUnit 3 Test Item nunit-test [C#],F#,VB Test/NUnitNUnit 3 Test Project nunit [C#],F#,VB Test/NUnitProtocol Buffer File proto Web/gRPCRazor Class Library razorclasslib [C#] Web/Razor/LibraryRazor Component razorcomponent [C#] Web/ASP.NETRazor Page page [C#] Web/ASP.NETSolution File sln SolutionWeb Config webconfig ConfigWindows Forms App winforms [C#],VB Common/WinFormsWindows Forms Class Library winformslib [C#],VB Common/WinFormsWindows Forms Control Library winformscontrollib [C#],VB Common/WinFormsWorker Service worker [C#],F# Common/Worker/WebWPF Application wpf [C#],VB Common/WPFWPF Class library wpflib [C#],VB Common/WPFWPF Custom Control Library wpfcustomcontrollib [C#],VB Common/WPFWPF User Control Library wpfusercontrollib [C#],VB Common/WPFxUnit Test Project xunit [C#],F#,VB Test/xUnit创立最小API程序我的项目在.NET Core中创立程序的形式有多种,能够应用命令行工具执行dotnet new <模板名称> <项目名称>创立,也能够应用IDE(如:Visual Studio, Rider, VS Code)来创立。 ...

September 15, 2021 · 3 min · jiezi

关于c#:Reflector图标

图标阐明namespace 名称空间interface 接口delegate 委托event 事件enum 枚举internal enum 只供同一程序集外部拜访的枚举public class 类internal class 只供同一程序集外部拜访的类只含get的属性包含get 、set的属性public 办法(函数)public static 办法(函数)private 办法(函数)private static 公有静态方法(函数)公有字段const 常量字段private static 字段internal 字段protected 字段protected override void Finalize(); internalstaticprivate protectedfield 字段(一般字段、const、readonly)

September 13, 2021 · 1 min · jiezi

关于c#:C中-get-set-的使用

学习c#的过程中,常常遇到这样的语句: public string StudentName { get{return stuName;} set{stuName=value;}} 《Visual c#.net程序设计教程》笔记:在许多面向对象程序设计语言中,属性 { Student stu = new Student(); Console.Write(stu.StudentName); Console.ReadKey(); } } } 下面代码中定义了一个属性StudentName,它蕴含get拜访器和set拜访器。属性StudentName封装了类Student中的字段stuName,字段如果没有加拜访控制符,被默认为private,外界不能间接拜访它,当初外界能够通过StudentNamee属性自在地存取 stuName字段了。 属性的get和set都是可执行的程序语句组合,具备行为的特点;而应用具备get拜访器和set拜访器的属性时候就像应用字段一样,即能够作为左值承受数据,又能够作为右值输入数据,零碎正是依照属性呈现在语句中的地位,主动地抉择是调用get还是调用set。 属性的读写管制 属性中的get和set能够只用一个,如果只有get而没有set,那么这个属性只可读出,不可写入;如果只有set而没有get,那么这个属性是只写入,不可读出。在属性中实现更多功能 既然get和set是程序,那当然能够做更多的事件。一个正当的分工是:设计字段是为了便于外部办法应用,而尽量与外界断绝;设计属性思考的是不便外界的应用,然而不让外界晓得的数据一律不给。具体阐明: set 拜访器与返回 void 的办法相似。它应用称为 value 的隐式参数,此参数的类型是属性的类型。在下例中,set 拜访器被增加到Name 属性: public string Name { get { return name; } set { name = value; }}当对属性赋值时,用提供新值的参数调用 set 拜访器。例如: e1.Name = "Joe"; // The set accessor is invoked here在 set 拜访器中对局部变量申明应用隐式参数名 (value) 是谬误的。 ...

September 13, 2021 · 2 min · jiezi

关于c#:C新手-该如何规划学习学习路线指南

C#学习路线指南破费了几天工夫整顿了C#学习路线图,能够说是纯家养C#程序员成长路线布局,在这里分享下,心愿能够帮忙到想从事C#开发的同学们。自己经历尚浅,有些知识点可能分享不正确,心愿宽广网友评论区补充,我会同步修改更新。题记最近本人始终在想,一个初学者刚开始应该学些什么,该学习到哪种水平找工作才不成问题,能力在做我的项目时熟能生巧不被Bug所困住。 是不是每一个初学者在刚开始学习任何一门编程语言的时候,都会有这样的疑难,都感觉无从下手,没有脉络。反正我过后的确有这样的困惑,在刚开始接触编程的时候,过后幸好有实验室学长和老师的倡议,才缩小了试错老本,能够把更多工夫都破费在正确的事件上,学习效率才会高。 依据我过后的学习状况和当初目前市场上的行情来剖析,列举出新手学习C#编程语言路线指南,心愿对你有帮忙。 计算机根底如果你是本科生的话,在校期间,应该会学习计算机根底,C语言,计算机组成原理,操作系统等对于计算机的课程,我心愿你好好学习,尤其是C语言,它是一种特地容易入门上手和理解编程思维的语言,是面向过程式的开发,首先你得学会应用它的语法做一些简略的逻辑运算,其次能够依据肯定的需要,实现局部非凡算法的演练(这些对你前期学习面向对象开发语言有很大的帮忙)。 如果没有开设这些课程,那么就须要你花工夫去互联网上找相干视频去学习。 举荐书籍: 《C语言程序设计》(第2版)谭浩强版本《大话数据结构》 程杰《数据结构C语言版》 严蔚敏版《深刻了解计算机系统》(美)布赖恩特举荐视频: 【C语言】《带你学C带你飞》(https://www.bilibili.com/vide...)数据结构与算法根底(青岛大学-王卓)(数据结构与算法根底(青岛大学-王卓)_哔哩哔哩_bilibili)[C语言形容]《数据结构和算法》(【C语言形容】《数据结构和算法》_哔哩哔哩_bilibili)C#基础知识根底语法你如果后期学习过C语言的话,那么学习C#基础知识就会感觉很容易,特地好了解。在这个环节你须要认真学习基础知识,你得学会在保障语法不报错的状况下,利用基础知识写一些简略的算法;得纯熟理解语法,应用切当并能够实现一些逻辑代码。 (根底语法、数据类型、变量、循环、办法、数组、汇合、判断、类等) 面向对象开发C语言是面向过程的开发语言,而C#是面对对象的开发语言,在应用C语言写逻辑代码时都是能够依照肯定的顺利逻辑将其实现就OK,而C#就不一样,你在学习语法,实现业务逻辑时得思考程序的可扩展性,鲁棒性等。 你得领有抽象思维,能够将事实中无生命体征的物品进行拟物解决,将它们进行更为形象的提炼,汇总为某个非凡类,让其这个类代表这类物品,并让其领有这个物品的所有属性和行为,这就是面向对象开发。 (继承、封装、多态、接口、抽象类等) 这一部分的学习比拟形象,学会领有抽象思维,让本人能够更好的了解这些知识点。 基础知识进阶这里你将会学习一些高端的编程玩法,可能短期内,你无奈应用到,然而它们更多体现在你的职业前期,当你理论应用框架或者浏览源码的过程中,都会遇到这些知识点,并有可能被它困住。 (Linq、泛型、委托、事件、多线程、Socket开发) 举荐书籍: C#图解教程(第五版) (5星举荐入门教程)C#入门经典 (外面的进阶方面常识介绍的很)CLR via C# (很厚很厚的书,能够看做工具书应用)举荐视频 C#语言入门详解(https://www.bilibili.com/vide...)C#入门到精通(传智播客黑马程序员课程(https://www.bilibili.com/vide...))举荐在线学习网址 菜鸟教程(https://www.runoob.com/csharp...)微软官网文档(https://docs.microsoft.com/zh...) 前端技术在编写后端代码的过程中,咱们或多或少的须要对页面进行解决,那么理解和会应用前端语言是至关重要的。对于前端技术,只须要把握到会用的水平就能够,看得懂,会用,会写就OK。刚开始学习的话就是网页三剑客 HTML+CSS+JavaScript,这里我举荐看网上的菜鸟教程和视频来学习,这样很容易上手,做出货色后就很有满足感。 其次就是Jquery+AJAX技术,它是很老的技术了,目前市面上比拟风行的Vue、Angular、React等框架都是对底层Jquery+AJAX的高度封装实现,所以咱们把握理解Jquery和AJAX技术很有必要。 因为前端技术这几年倒退特地快,各种新技术如雨后春笋般涌现,所以咱们大家在学习的过程中要抓住主次,别什么都学习。这里我举荐大家学习Vue.js(3.0),目前很多公司都在应用它,咱们学好它,对当前找工作会有很大的帮忙。至于其余的前端技术,没有必要全都去学习,等到公司或者说当前我的项目须要应用它的时候,咱们再学习也不迟。置信我,那些货色都是很容易上手的,原理都是通的,就看你会不会活学活用了。 前面可能还得学习Node.js、NPM等用于公布和构建的技术,这些也能够等理论应用的时候再去学习。 举荐书籍 《JavaScript DOM 编程艺术》《JavaScript权威指南》(犀牛书)《深入浅出Node》《HTTP权威指南》举荐教程 菜鸟教程JavaScript教程(JavaScript教程 - 廖雪峰的官方网站 (liaoxuefeng.com))Vue官网文档(介绍 | Vue.js (vuejs.org))数据库对于数据库的学习,须要先从最根本的SQL语句开始,这个能够通过看菜鸟教程来理解和相熟,SQL语句学习的过程中要装置好数据库环境来实际操作,不能只死记硬背公式,要学会死记硬背,在实在的数据库中来体验。 目前数据库分为关系型数据库和非关系型数据库。 关系型数据库:Sql Server、MySQL、Oracle、SQLite、DB2等。 非关系型数据库:MongoDb、Redis、NoSql等。 对于咱们未来从事编码开发的人员来说,我感觉你首先先学会应用Sql Server和MySql数据库,其余的数据库在当前的开发中再去学习也不迟。 就拿Sql Server来说,你学习完后在前面的C#高级常识中,应用ASP.NET MVC或者Web Api技术可立马实际操作利用数据库。你能够先写一些简略的CRUD,实现一些根本的性能,这对你前期的成长至关重要。 举荐书籍 《SQL必知必会》《Microsoft SQL Server 2008技术底细:T-SQL查问》举荐教程 SQL教程(SQL教程 - 廖雪峰的官方网站 (liaoxuefeng.com))菜鸟教程(https://www.runoob.com/csharp...)SQL Server文章目录(https://www.cnblogs.com/Carey...)C#高级常识对于高级常识局部这个环节,你能够试着做出点理论我的项目进去,不论是ADO.NET 还是ASP.NET MVC或者ASP.NET Web API,你都能够先跟着书本或者视频教程,先让本人会用继而模拟看他人的写法,本人也入手进行实现。你能够在Github或者Gitee中找到一些开源的我的项目,比方图书管理系统、博客零碎,论坛等一系列应用高级常识来实现的我的项目,你须要先浏览代码,看他人是如何实现的,从而在仿照他人的实现过程来依照本人的想法编写本人的零碎。(通过这样的实战我的项目,你能够疾速的上手实现,学着并尝试做一个全栈开发,本人一个人从前端到后端再到公布上线,体验下整个软件我的项目的残缺生命周期)。 ADO.NET: 它是最原始的数据库拜访技术,目前根本都不应用,市面上公司都是应用封装好的ORM,然而你也得学习它。你得理解它是如何和数据库进行交换的,尝试着本人做这些步奏,看是否能顺利连贯数据库,并进行一系列的CRUD操作。 ...

August 30, 2021 · 1 min · jiezi

关于c#:类型系统设计师

类型零碎设计师 之前想聊聊规范库和类型零碎(C# 类型零碎),但当初想想,不如聊聊类型零碎设计师(类型零碎设计师是怎么炼成的) 或者这才是经验过很大的考量之后,设计进去的类型零碎的样子 参考https://www.tutorialsteacher.... +对 C# type 和 .NET type 的由来的把握(C#, C# type, .NET type, C# 规范库, mscorlib.dll)(C# 类库 其实是来自于他 ‘面对的问题’ 是怎么的(他关注的问题就是桌面软件开发,他可能预知到了为 .NET 平台开发软件会遇到什么问题 所以才把 C# 设计得这么好))https://www.javatpoint.com/csharp-data-typeshttps://www.c-sharpcorner.com/UploadFile/dacca2/difference-between-data-type-in-C-Sharp-and-data-type-in-net/https://docs.microsoft.com/en-us/dotnet/api/system.eventhandler-1参考 Immutable Collections 是 .NET Framework 的根底外围类库之一https://www.cnblogs.com/xishu... System.Collections.Concurrent Classes ( vs Java JUC )https://docs.microsoft.com/en... EventHandler<TEventArgs> Delegatehttps://docs.microsoft.com/en... 语言反对、 app 程序员、SDK 的关系如果以程序软件的模式失去一个小成绩,那么须要有 operation blueprint 和 business logic blueprint 。开发者必然是 app 程序员,而在两个层面上都要用到编程语言提供反对。 如果一个语言有幸提供反对给一个弱小的 operation architecture 那么它肯定是一个好语言如果一个语言提供反对给一个还不错的 LOB developer 用的 framework architecture 那么它不肯定是一个好语言(但肯定是有 framework developer 的功绩,封装师的功绩: 比方对于 web app C/S 架构, 封装师不仅封装出很根底的形象模型接口 还提供了现成的可令人调用的函数, 参考 WSGI 接口 和 Django framework / Rack 接口 和 WEBRick 服务器 和 ror 框架 12122) 4 5 )参考https://www.zhihu.com/questio...封装师给出的 Laravel 提供了大量助手函数长得像PHP内置一样,在框架中外围中大量应用这些自定义全局辅助办法,这是尽量复用和优雅的后果评估:二者解决问题的层面不同,二者关注的问题不同;封装师生产类型零碎设计师给出的类型零碎https://segmentfault.com/a/11...类型零碎设计师 ...

August 25, 2021 · 1 min · jiezi

关于c#:WPF的通关之路

首先阐明两点,一是集体是业余爱好桌面开发(单纯以找工作去学客户端开发,这种行为不太举荐哦),二是WPF的款式比Winform真的要好看很多(因为自定义的很自在)。 根本除了3D之类的图像和相干动画成果没有涵盖进去 其余的罕用的根本都涵盖了在外面。 外面次要分类为根本控件、布局控件、视图控件、条目控件、其余UI(弄 的理论我的项目可用的界面),其实分类并不是很精准,只是便于辨别而已。 局部截图: 自定义的播放器: ps: 这播放根本的性能都实现了,没有清空列表的性能,页面缩放的自适应根本没问题。 源码:https://gitee.com/ten-ken/Ken_WPF_UI 欢送关注我的公众号:程序员ken,程序之路,让咱们一起摸索,共同进步。

August 22, 2021 · 1 min · jiezi