
小技术_C#
文章平均质量分 84
日拱一两卒
日拱一卒无有尽、功不唐捐终入海
展开
-
多线程之旅(10)_QueueUserWorkItem和UnsafeQueueUserWorkItem的区别
这是个比较冷门的点,是我在写多线程之旅(2)_创建一个属于自己的精简线程池_线程调度策略——附C#源码这篇文章时,发现在做线程队列时,官方选用的是UnsafeQueueUserWorkItem,而不是常见的QueueUserWorkItem,所以后续我就对这两个方法调查一番,发现资料也不多,总结一下。一、官方定义首先看一下官方的定义:来源:https://docs.microsof...原创 2019-05-28 02:15:03 · 3064 阅读 · 0 评论 -
多线程之旅(12)_聊聊线程池在系统内部运转的基本原理
线程池的作用其实“线程池”就是用来存放“线程”的对象池。在程序中,如果某个创建某种对象所需要的代价太高,同时这个对象又可以反复使用,那么我们往往就会准备一个容器,用来保存一批这样的对象。于是乎,我们想要用这种对象时,就不需要每次去创建一个,而直接从容器中取出一个现成的对象就可以了。由于节省了创建对象的开销,程序性能自然就上升了。这个容器就是“池”。很容易理解的是,因为有了对象池,因此在用完...转载 2019-05-31 00:42:59 · 291 阅读 · 0 评论 -
多线程之旅(13)_多线程技术的一些补充内容
之前的历史文章列表多线程之旅(1)_线程同步之AutoResetEvent和ManualResetEvent的区别、用法——附C#源码示例多线程之旅(2)_创建一个属于自己的精简线程池_线程调度策略——附C#源码多线程之旅(3)_如何使用lock()来实现对象和代码块的加锁功能(详解)多线程之旅(4)_async/await的用法精细详解多线程之旅(5)_眼花缭乱的sleep,...原创 2019-05-31 17:13:25 · 295 阅读 · 0 评论 -
多线程之旅(11)_如何限制系统线程池ThreadPool的最大最小并发数量_SetMaxThreads/SetMinThreads用法
ThreadPool有两个设置线程池并发数量的方法,分别是:ThreadPool.SetMinThreads(int workerThreads, int completionPortThreads)//设置最小线程并发数ThreadPool.SetMaxThreads(int workerThreads, int completionPortThreads)//设置最大线程并发数参数...原创 2019-05-29 01:29:39 · 13248 阅读 · 14 评论 -
使用C#爬取网页港股股票行情数据——附C#源码
GitHub地址:https://github.com/yangwohenmai/TEST/tree/master/HttpWebRequest爬取港交所数据最大的问题是如何获取港交所页面的Token,有了Token之后就可以从港交所接口请求数据了。下面这段python首先解析港交所页面,从页面中获取港交所Token值,而后请求返回的数据,数据格式类似于Json,但是需要稍微处理一下,就可...原创 2019-06-03 08:59:06 · 2752 阅读 · 0 评论 -
Socket长连接、短连接使用方法——附C#源码
对于Socket来说,链接类型一般分为长连接和短连接。长连接和短连接在程序上基本没有区别,区别是短连接每次发送完消息都要调用Close()方法来释放资源,而长连接则不调用Close()方法,从而保持持续不断的通信功能。GitHub代码服务端:https://github.com/yangwohenmai/TEST/tree/master/SocketServerGitHub代码客户端:...原创 2019-06-17 12:25:39 · 9656 阅读 · 2 评论 -
Socket高并发出现TIME_WAIT的原因以及解决办法
最近公司项目遇到个问题,在Socket并发量较大的情况下,每次服务端发送完数据后,Sevice端采取主动Close的方断开连接。客户端用短连接的方式发送请求,会出现大量请求返回TIME_WAIT的现象。在网上找了一些可用的解决方法,下次运维再来找,直接扔给他们。参考链接如下:TCP/IP详解--TIME_WAIT状态详解:https://blog.youkuaiyun.com/yusiguyuan...转载 2019-06-17 14:25:18 · 9044 阅读 · 0 评论 -
C# MVC 后台或前端页面跳转Action的常用方法
1、利用View()直接返回视图(不执行Action方法)public class ScoreController : Controller{ public ActionResult Index(string name, int age) { #region View()的三种写法 return View();//返回Index视图 ...转载 2019-06-18 14:05:17 · 8416 阅读 · 0 评论 -
用Redis作为消息队列的使用方法——附C#源码
消息队列概念文章源码Github地址:https://github.com/yangwohenmai/TEST/tree/master/Redis在Redis中,消息队列的用法称之为redis的 发布/订阅,以下是官方文档的介绍redis的另一个常见用法是作为 发布/订阅消息分发工具;这也很简单,并且在连接失败的情况下, ConnectionMultiplexer 将处理重新订阅所...原创 2019-06-24 16:57:14 · 5076 阅读 · 0 评论 -
并发时WebRequest同一个网址只能访问两次的解决办法——附C#源码
一、问题描述有时候我们会用HttpWebRequest的方式向某个网站发送请求,方法如下: WebRequest request1 = HttpWebRequest.Create("https://blog.youkuaiyun.com/"); request1.BeginGetResponse(ar => { ...原创 2019-06-28 10:27:41 · 1227 阅读 · 3 评论 -
后端数据分页——table表数据分页方法(2)
我们在页面展示一个table表格的时候,当数据量较大时,常常会考虑到数据分页的问题,数据分页一般有三种方式,分别是前端数据分页,后端数据分页,数据库分页。前端数据分页:是把所有数据加载到前端,然后在前端用js实现数据的分页,这种分页方式是最方便简单的,但是也是效果最差的。因为当数据量很大时,前端加载数据耗时很久,页面会因为加载数据而无法正常显示,体验很差。并且因为数据是一次性加载到前端,当数...原创 2019-07-13 00:40:11 · 1266 阅读 · 0 评论 -
多线程之旅(7)_Task和Thread有参无参,有、无返回值,的28种调用方式汇总——附C#源码
刚接触线程最困惑的事情应该就是如何优雅的启动一个线程。掌握了简单的线程调用方法后,又会困惑我想要给线程传参怎么写?我想获取线程返回值怎么写?我想线程里面继续调用其他线程该怎么写?我总结了Thread和Task的几十种启动线程的方法,包含有参数调用、无参数调用、有返回值调用、无返回值调用。挑一挑,必有一款适合你。Github源码地址:Thread的调用方法:https://github...原创 2019-05-17 09:48:55 · 1821 阅读 · 0 评论 -
多线程之旅(9)_如何安全的取消正在执行的线程——附C#源码
当线程能流畅安全的自动运行后,我们就要考虑一些更风骚的操作,就是如何在线程运行的过程中对线程进行干预。用Above销毁线程首先过于简单粗暴,强行停止往往会抛出一些未知的错误,而且也丧失了对线程控制的能力。此时,我们可以通过CancellationTokenSource来优雅的取消一个正在执行的线程。何谓优雅?优雅就是我们在发出指令停止一个线程的时候,线程会判断此时是否可以停止;如果可以停止...原创 2019-05-21 13:12:55 · 1568 阅读 · 0 评论 -
多线程之旅(8)_Task的异常捕获和处理方法——附C#源码
我们的线程一旦大量(高并发)且有序(线程同步安全)的起飞后,我们就要关心如何优雅的处理线程异常了。在线程内部写try,catch当然是可以的,但这种捕获方法就使得我们无法在外部主进程中很好的对线程异常进行控制,只能随他自生自灭。所以我们主要讨论一下在线程外部如何捕获线程的异常信息。线程异常的捕获方法有阻塞型捕获和异步捕获两种。阻塞型捕获异常就是:当一个或多个线程启动后,我们就一直等待,等到所...原创 2019-05-21 11:13:50 · 8996 阅读 · 0 评论 -
用POP3获取邮箱邮件内容,支持SSL验证登陆(完整C#源码)
延续上一篇用POP3获取邮箱邮件内容(C#源码)上一篇中提到一个问题,网上一般流传的是非SSL验证登陆的,适用163之类的邮箱,但是QQ邮箱一般都是登陆不上的。这次我来提供一个支持SSL验证登陆的方法。程序效果如下,可以看到读取的邮件内容确实是QQ邮箱的邮件。准备工作:下载一个OpenPop服务器pop.qq.com端口:995需要开启3方授权码。下面直接上...原创 2019-01-22 10:31:33 · 3223 阅读 · 3 评论 -
用POP3获取邮箱邮件内容(完整C#源码)
准备工作:下载一个OpenPop的插件,OpenPop.dll这里测试了163邮箱和QQ邮箱,163邮箱直接用账号和授权码就能登录,QQ邮箱需要用SSL验证。163的服务器是:pop3.163.com , 端口是110QQ邮箱服务器是:pop.qq.com ,端口是995,需要SSL验证,这段代码没有实现QQ邮箱SSL的验证登陆,非SSL的应该都是没有问题的,后续抽空我会再把SSL的...原创 2019-01-21 10:49:01 · 8714 阅读 · 30 评论 -
多线程之旅(2)_创建一个属于自己的精简线程池_线程调度策略——附C#源码
相信接触过多线程一段时间的朋友,都会想拥有一个属于自己的可靠的线程池,不用每次做一个新项目时,都要重新考虑如何去控制线程的有序性。下面就送给大家一个精简可靠的线程池,请忽略“多线程之旅”这个土味标题。这个线程池可以通过传参来控制最大并发线程数量。其实,这个线程池的class是微软官方提供的一个示例,实现了TaskScheduler这个父类中的方法。事实上,现在网上实现线程池的方法,大多其实...原创 2019-05-02 10:31:54 · 653 阅读 · 0 评论 -
简洁ORM框架_Dapper的用法——附C#源码
程序和测试数据的github下载地址:https://github.com/yangwohenmai/TEST/tree/master/DapperDB项目这里要引用一个System.Data.SQLite.dll 一个Dapper.dll链接数据库方法如下,这里数据库用的是轻量级的sqlite,方便我上传数据库给大家测试用/// <summary> /...原创 2019-04-18 17:34:52 · 1547 阅读 · 0 评论 -
多线程之旅(3)_如何使用lock()来实现对象和代码块的加锁功能(详解)
多线程场景中,当不同的线程都需要访问某个资源的时候,就需要同步机制了,线程同步有多种方法,如线程设置等待状态,对公有资源枷锁等。也就是说当对同一个资源进行读写的时候,我们要使该资源在同一时刻只能被一个线程操作。lock锁是C#中最常用的同步方式,格式为lock(objectA) {codeB} 。根据lock的这种特性,对于lock衍生出了两种不同的用法1.用lock来锁对象最常见...原创 2019-05-02 18:01:07 · 2797 阅读 · 0 评论 -
如何在配置文件app.config中自定义节点——附C#源码
源码github地址:https://github.com/yangwohenmai/TEST/tree/master/SetConfiguration在配置文件app.config中,想要自定义节点的话,格式还是很重要的1.首先要创建一个<configSections>节点,而且这个节点要在<configuration>节点内部的最顶端,否则会报错“无法初始...原创 2019-04-19 09:45:33 · 3178 阅读 · 0 评论 -
多线程之旅(4)_async/await的用法精细详解
GitHub源码地址:稍后async/await是个常见但不常用的方法。常见是因为在比较官方的代码。片段里经常见到这样的搭配,不常用是因为作为开发人员来说,我们常常有更熟知的方法去代替他。async/await到底有什么用呢,其实网上也很少有说的明白的文章,下面我来尽量简单明了的解释一下。1.使用场景async/await这两个关键字用在线程同步/异步的场景中。2.语法方法...原创 2019-05-08 15:53:44 · 1446 阅读 · 3 评论 -
多线程之旅(1)_线程同步之AutoResetEvent和ManualResetEvent的区别、用法——附C#源码示例
GitHub源码地址:https://github.com/yangwohenmai/TEST/tree/master/ResetEvent原文在:https://www.cnblogs.com/qingyun163/archive/2013/01/05/2846633.html这篇文章介绍了AutoResetEvent和ManualResetEvent的用法和区别,例子很生动易于理解,转...转载 2019-04-30 13:55:47 · 632 阅读 · 0 评论 -
多线程之旅(5)_眼花缭乱的sleep,wait,yield,join,Abort,ContinueWith,RunSynchronously,background方法详解
1.sleep()Thread.sleep(1000);sleep()方法是Thread类的静态方法,也是native方法。sleep()方法需要捕获InterruptedException异常。不会释放“锁标志”。sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低...原创 2019-05-15 10:34:09 · 373 阅读 · 0 评论 -
多线程之旅(6)_Semaphore和SemaphoreSlim关于WaitOne、Release的用法详解——附C#源码
Semaphore、WaitOne、Release三者组成了一个互斥信号量的完整体系结构。Semaphore、WaitOne、Release究竟和AutoResetEvent/ManualResetEvent、WaitOne、Set、Reset有什么区别呢?我们往下看。GitHub源码地址:https://github.com/yangwohenmai/TEST/tree/master/Sem...原创 2019-05-16 01:11:47 · 4159 阅读 · 0 评论 -
数据库取数分页——table表数据分页方法(3)
我们在页面展示一个table表格的时候,当数据量较大时,常常会考虑到数据分页的问题,数据分页一般有三种方式,分别是前端数据分页,后端数据分页,数据库分页。前端数据分页:是把所有数据加载到前端,然后在前端用js实现数据的分页,这种分页方式是最方便简单的,但是也是效果最差的。因为当数据量很大时,前端加载数据耗时很久,页面会因为加载数据而无法正常显示,体验很差。并且因为数据是一次性加载到前端,当数...原创 2019-07-13 10:24:18 · 1651 阅读 · 0 评论