![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C#
文章平均质量分 56
KelonsByCsdn
这个作者很懒,什么都没留下…
展开
-
C#利用HtmlAgilityPack实现简单爬虫
1.下载HTML:public static string DownloadHtml(string url) { HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest; request.Timeout = 30 * 1000; // 30s超时 request.UserAgent = "Mozilla/5.0 (Windows原创 2021-03-28 16:45:06 · 410 阅读 · 1 评论 -
C#多线程--信号量(Semaphore)
百度百科:Semaphore,是负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。也是操作系统中用于控制进程同步互斥的量。Semaphore常用的方法有两个WaitOne()和Release(),Release()的作用是退出信号量并返回前一个计数,而WaitOne()则是阻止当前线程,直到当前线程的WaitHandle 收到信号。这里我举一个例子让大家更容易理解:当我们这样实例化Semaphore时候Semaphore sema = new Semaphore(x,y)有一队.转载 2021-03-03 09:26:51 · 469 阅读 · 0 评论 -
C#在方法注释中添加客跳转到其他方法的链接
/// <summary> /// <see cref="Test2"/> for more. /// </summary> private void Test() { } private void Test2() { }原创 2021-02-20 18:33:49 · 906 阅读 · 1 评论 -
转:谁能详细说一下程序中使用 async await的好处吗?
谁能详细说一下程序中使用 async await的好处吗?_博问_博客园 (cnblogs.com)转载 2021-02-09 15:03:37 · 113 阅读 · 0 评论 -
.Net性能测试工具BenchmarkDotnet
转自:.Net性能测试工具BenchmarkDotnet_郑廿三-CSDN博客_benchmarkdotnet转载 2021-01-22 14:32:28 · 370 阅读 · 0 评论 -
5 种避免使用 C# lock 关键字的方法
转自:林明基 5 种避免使用 C# lock 关键字的方法 - 知乎 (zhihu.com)提起多线程编程,始终离不开线程安全(资源竞争)的问题。如果没有处理好这些问题,往往在会出现开发一时爽,调试火葬场的情况。大都数语言中都会提供一些特定的方法来简化多线程开发,比如 C# 就提供了 lock 关键字来解决这些问题。如果你在开发的过程中正确的使用了 lock 关键字,将有效的避免许多线程安全的问题。但是任何解决方案都是存在代价的,一味使用 lock 的话也会照成意想不到的性能(逼格)损失...转载 2021-01-22 14:19:16 · 652 阅读 · 0 评论 -
关于EF多线程更新数据的一个报错
报错信息:Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded.存储更新,插入或删除语句影响了意外的行数(0)。自加载实体以来,实体可能已被修改或删除。原因:线程1中被标记为删除的元素,在SaveChanges的时候发现在数据库里已经不存在原创 2021-01-22 13:56:54 · 1734 阅读 · 0 评论 -
C#利用静态泛型缓存 和 表达式树实现高效的深拷贝
/// <summary> /// 提供对象或集合的深拷贝(拷贝private/public:实例成员、属性、静态成员) /// </summary> /// <typeparam name="T">对象类型或集合元素类型</typeparam> public class DeepCopyHelper<T> where T : class, new() { /// <summa...原创 2020-11-15 10:03:14 · 1051 阅读 · 0 评论 -
程序以系统管理员身份运行
1、在Visual Studio 中--解决方案资源管理器--右键项目名称--属性,找到“安全性”选项,勾选“启用ClickOnce安全设置”:2、这时,在项目下面会多出一个“app.manifest”的文件,选中它,并找到代码段<requestedExecutionLevel level="asInvoker" uiAccess="false" />,将其改为:<requestedExecutionLevel level="requireAdministrato.转载 2020-11-15 10:00:17 · 180 阅读 · 0 评论 -
记录一次:异步给ToolStripItem.Image赋值导致的System.ArgumentOutOfRangeException报错
报错日志:System.ArgumentOutOfRangeException: 索引超出范围。必须为非负值并小于集合大小。参数名: index 在 System.Collections.ArrayList.get_Item(Int32 index) 在 System.Windows.Forms.ToolStripItemCollection.get_Item(Int32 index) 在 System.Windows.Forms.ToolStrip.OnPaint(PaintEve...原创 2020-05-21 16:42:13 · 612 阅读 · 0 评论 -
C#中Lock锁的对象选择问题
转自https://blog.csdn.net/sl1990129/article/details/791509351、为什么不能lock值类型 比如lock(1)呢?lock本质上Monitor.Enter,Monitor.Enter会使值类型装箱,每次lock的是装箱后的对象。lock其实是类似编译器的语法糖,因此编译器直接限制住不能lock值类型。退一万步说,就算能编译器允许你...转载 2020-05-07 14:54:19 · 1409 阅读 · 0 评论 -
PDF预览组件 Adobe Reader ActiveX控件使用
打开PDF文件的两种方法:https://blog.csdn.net/sl1990129/article/details/78094602本文介绍第二种:1. Adobe Reader ActiveX功能使用 Acrobat Reader Activex控件可以在 Authorware应用程序中操作PDF文件2. Adobe Reader Astivex的属性src:设置要打开的...转载 2020-01-07 10:54:31 · 6271 阅读 · 0 评论 -
线程安全的集合
https://www.itsvse.com/thread-3769-1-1.html转载 2020-01-02 15:36:44 · 105 阅读 · 0 评论 -
C#各版本语法链接
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-8转载 2019-11-19 15:18:34 · 216 阅读 · 0 评论 -
ORM
https://www.cnblogs.com/RobotH/archive/2007/08/22/865942.htmlhttps://www.cnblogs.com/yaopengfei/p/9196962.htmlhttps://www.cnblogs.com/loverwangshan/p/9915745.htmlhttps://www.cnblogs.com/wyy1234/...转载 2019-11-07 09:10:43 · 97 阅读 · 0 评论 -
Delegate的Invoke、BeginInvoke,与控件的Invoke、BeginInvoke方法
转自:https://www.cnblogs.com/EasonLeung/p/3683492.html 一、Delegate的Invoke、BeginInvoke1、Delegate.Invoke (委托同步调用) a、委托的Invoke方法,在当前线程中执行委托。 b、委托执行时阻塞当前线程,知道委托执行完毕,当前线程才继续向下执行。 c、委托的Invoke方法,...转载 2018-07-04 22:36:20 · 1192 阅读 · 0 评论 -
关于跨线程访问ui线程的问题
“不允许访问”指的是:不能跨线程给UI控件赋值(进行set操作);有些控件,如TextBox,如果赋的新值和原先的旧值相等,也是允许跨线程操作的,因为这些控件在执行set操作时,会先判断新旧值是否相等,如果相等,就不进行任何操作。这点可以看它们的源码。跨线程情况下,进行get操作是允许的。备注:get: 取值set: 赋值...原创 2019-03-24 14:41:33 · 478 阅读 · 0 评论 -
C#反射类中的子类(即嵌套子类),类之间用“+”连接
要反射的程序集代码:namespace ReflectionClassLibrary{ /// <summary> /// 第一层 /// </summary> public class A { /// <summary> /// 第二层 /// </summa...原创 2019-04-10 18:46:38 · 1701 阅读 · 0 评论 -
经典的IDisposable实现模式
背景:GC回收定义了析构方法的对象的过程:正常情况下,定义了析构方法的对象,在构造器调用之前,会将该对象的引用放到一个终结列表中;当其从应用程序不可达时,GC会扫描终结列表查找该对象的引用,找到后,从终结列表中移除,并附加该引用到freacheable队列;有一个专用高优先级线程,一旦当freachable队列中有记录时,该线程会被唤醒,该线程会将每一项从freachable队列中移...原创 2019-04-02 22:17:22 · 722 阅读 · 0 评论 -
Stephen Cleary关于Task.Run 与 BackgroundWorker的比较
英文链接https://blog.stephencleary.com/2013/05/taskrun-vs-backgroundworker-intro.html结论:建议使用Task.Run转载 2019-08-16 09:46:33 · 834 阅读 · 0 评论 -
EF中 int类型做主键的特殊情况处理
EF中,主键是int类型时,会自动认为该字段是自增长,导致生成的SQL语句中不会出现这个字段。解决办法:自增的int字段上加特性: [Key,DatabaseGenerated(DatabaseGeneratedOption.None)]public enum DatabaseGeneratedOption{ None = 0, Identity = 1, ...原创 2019-09-03 16:36:27 · 783 阅读 · 0 评论 -
使用ConfuserEx加密混淆程序以及如何脱壳反编译
ConfuserEx是.NET下的一款开源混淆工具,功能比较强大,应用也较广泛,本文就使用ConfuserEx工具演示如何混淆及如何对其混淆的程序进行脱壳。所需工具:请自行百度下载如下工具:ConfuserEx、UnConfuserEx、Fixer、ConfuserExStringDecryptor、ConfuserExSwitchKiller、de4dot、ILSpy...转载 2019-09-05 11:18:28 · 7160 阅读 · 1 评论 -
Linq中 SelectMany的理解 C#
1.selectMany不同于select;selectMany对于嵌套IEnumerable<T>很有用;比如对于下面的数据结构:public class TestClass { public string Name { get; set; } public int Age { get; set; } public...原创 2019-09-14 15:33:01 · 693 阅读 · 0 评论 -
C#实现表达式树Expression的与、或、非运算
以下使用扩展方式实现 /// <summary> /// 表达式树运算 扩展方法 /// </summary> public static class ExpressionExtension { /// <summary> /// 并 expr1 AND expr2 //...原创 2019-10-10 15:23:18 · 1306 阅读 · 0 评论 -
详解 利用NPOI向Excel指定位置中加入图片(支持.xlsx和.xls)
/* * Author:zhoukaikai * 注意:本项目中使用的NPOI版本为 V2.4.1.0;需要在NuGet上添加NPOI包 * 如果发现图片位置错误 或 图片不显示,请先确认NPOI版本是否与本项目一致 */ class Program { static void Main(string[] args) ...原创 2019-10-11 15:52:21 · 4231 阅读 · 3 评论 -
c#中async、await的几个注意点
1.先举例说明异步方法的执行顺序class Program { static void Main(string[] args) { Console.WriteLine($"线程Id: '{Thread.CurrentThread.ManagedThreadId}' 主线程开始"); Async();...原创 2019-03-22 18:48:25 · 2200 阅读 · 0 评论 -
反射泛型类与泛型方法
本文只做浅讲 一. 反射泛型类首先定义泛型类 GenericClass<T>namespace ReflectionClassLibrary{ public class GenericClass<T> { public string Show(T t) { return "参数是" + ...原创 2018-12-27 10:51:37 · 684 阅读 · 0 评论 -
C#深拷贝扩展方法(引用类型利用序列化实现深拷贝)
/// <summary> /// 深拷贝 /// 注意:T必须标识为可序列化[Serializable] /// </summary> /// <typeparam name="T"></typeparam> /// <param name="o...原创 2018-12-21 11:01:26 · 691 阅读 · 0 评论 -
关于编码方式Encode的知识
1.指定编码的两种方式:Encoding encode = Encoding.GetEncoding("GB2312");Encoding encode2 = Encoding.UTF8;2.字符串<=>二进制 (编码方式为Unicode)private static string ChineseToBinary(string s){ byte[] d...原创 2018-10-24 20:11:57 · 1104 阅读 · 0 评论 -
C#中自定义比较器 IEqualityComparer 接口的使用
参考:https://www.2cto.com/kf/201211/167061.html相关:https://www.cnblogs.com/xiaochen-vip8/p/5506478.htmlhttps://www.2cto.com/kf/201404/289670.html转载 2018-10-17 23:35:33 · 2512 阅读 · 0 评论 -
多态简单理解
ConstDataSet cn = new ConstDataSet();//基类变量指向基类对象ConstDataSet st = new SpecificTest();//基类变量指向子类对象调用非虚方法: 执行调用方法的变量类型对应的方法,如果没有找到,则往上回溯,查找基类中有无对应的方法;直到object,若找不到则报错调用虚方法: 执行调用方法的...原创 2018-07-30 09:41:09 · 148 阅读 · 0 评论 -
System.Environment.CurrentDirectory与Application.StartupPath
System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际上区别大得很。先说前者:比如说你程序放在桌面上启动,但是中间你用了一个OpenFileDialog打开了E盘名为abc的文件夹下的某一个文件,那么CurrentDirectory就变成E:\abc了,...转载 2018-07-11 16:00:02 · 463 阅读 · 0 评论 -
C#使用foreach循环的注意点
1.不能在在循环内部删除或增加元素;可能原因是,在执行foreach循环时,集合内部有一个变量用于记录集合中元素的个数,每次遍历时会检测这个变量有无发生变化,如果发生变化,则抛出异常。2.不能在循环内部修改元素(无论值类型还是引用类型);原因是,在遍历IEnumerator<T>的过程中,把当前的元素(即Current)暴露为只读属性。3.可以在循环内部修改对象的属性。...原创 2018-06-10 18:13:00 · 7242 阅读 · 0 评论 -
使用DataAdapter.Update的简单方法
转自:https://blog.csdn.net/Depraved_Survival/article/details/1464619在使用DataAdapter和DataSet更新数据库的时候,通常需要自己设置InsertCommand、UpdateCommand以及DeleteCommand等属性,比较繁琐,如果不写或者写错内容,那么DataAdapter.Update方法将会出错。我是一个懒人...转载 2018-06-06 14:55:22 · 7080 阅读 · 0 评论 -
EF框架中attach与entry的区别
转自:http://www.bubuko.com/infodetail-1222037.htmlEF:加入容器三种方式-->查询,attach,entry.不在容器里,不能用remove,add等方法.1.0 使用Attach可能会出错.//attach 意思:附上; 贴上,系;var db = new PhoneBookEntities();var queryCi=db.ContactIn...转载 2018-05-11 16:40:02 · 3470 阅读 · 0 评论 -
C#中子类是否继承了父类中定义的私有成员
1.结论:构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们;2.下面的程序用来验证子类对象中存在父类中定义的私有成员 class Program { static void Main(string[] args) { Son s...原创 2018-12-22 11:19:25 · 3694 阅读 · 0 评论 -
使用Interlocked实现类似Lock的同步效果
class Program { private static int theLock = 0;//信号量 private static int i;//全局变量,每个线程共享该变量 [STAThread] static void Main() { List<Task> t...原创 2018-12-29 14:02:49 · 379 阅读 · 0 评论 -
用async-await异步编程代替BackgroundWorker来异步执行耗时操作
在MSDN上看到一句话:The async-based approach to asynchronous programming is preferable to existing approaches in almost every case. In particular, this approach is better than the BackgroundWorker class for...原创 2019-11-21 09:47:17 · 1068 阅读 · 0 评论 -
ManualResetEvent的理解和使用
class Program { static void Main(string[] args) { //注意:ManualResetEvent可以对所有进行等待的线程进行统一控制 //true-初始状态为发出信号;false-初始状态为未发出信号 ManualResetEvent m...原创 2019-02-24 23:16:51 · 11451 阅读 · 0 评论 -
C#自定义可foreach的类型
1.不一定要实现 IEnumerable接口;2.类中定义与 IEnumerable接口中的GetEnumerator()方法相同的方法即可(方法名,返回值,参数都一致)。 class Program { static void Main(string[] args) { int[] array = { 1, 2, 3...原创 2019-01-02 19:18:24 · 1066 阅读 · 0 评论