有关.Net微信三公棋牌开发异步处理

2023-10-20 07:10

本文主要是介绍有关.Net微信三公棋牌开发异步处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

.Net微信三公棋牌开发异步处理论坛:aqiulian.com ,更多有关.Net异步处理的咨询Q:212303635。在处理很多IO逻辑时或者想在做后台计算时,我们都会用到并发。并发简单的分两种类型,一种是计算密集型,一种是IO密集型, 下面先介绍一下。

1. 计算密集型:
    如果我们把线程里面处理的事情看做一个任务,计算密集型就是这个任务主要做的事情是处理计算和逻辑,换句话说就是主要吃CPU。计算密集型的一个典型场景是在客户端程序后台做一些耗时的计算来避免界面假死。计算密集型任务并发处理,除了能避免某些线程阻塞外(比如界面假死),还能充分利用CPU资源,现在的PC机和笔记本一般都是双核或者4核,服务器更可能有好几个CPU,这样并发执行可以让计算机同时执行多个任务。

2. IO密集型:IO密集型任务里面一般要处理大量IO操作,当然,只包含一个IO操作的任务我们也可以看成IO密集型,原因是IO操作一般都比较耗时。IO密集型的场景更多,比如我们需要读取多个文件或者请求多个WebService等。IO任务并发执行优点更多,主要是节省CPU资源和加快处理速度。因为很多IO操作都比较耗时,但它们又基本用不到CPU,所以如果我们用单线程来处理,CPU可能长时间处于阻塞状态,啥活也不干,这样很浪费CPU资源。同时单线程使得IO操作只能一个一个执行,时间上也会更长。

    下面用几个简单的例子介绍如何在.Net里用线程池和异步来实现并发(当日你也可以直接创建线程来做)。

1. 最土鳖的例子,单任务计算密集型

   将一个计算密集型任务加入线程池,线程池会在有线程闲的时候执行该任务:
   

复制代码
        private static void Sample2(){ThreadPool.QueueUserWorkItem(count => Run((int)count), 20);}private static void Run(int count){for (int i = 0; i < count; ++i){Console.WriteLine(i);Thread.Sleep(100);}Console.WriteLine("finished");}
复制代码

上面的Run可以有任意的参数组合的委托,但是能加入QueueUserWorkItem的方法只能带一个object参数,需要打包一个参数类,然后在lambda里面分解后传给Run,也可以直接用一个字典当参数类。如果需要在计算完成时做一些处理,可以用下面的异步方法。 

 

复制代码
private static void Sample1(){Action<int> a = c =>{Run(c);};//异步执行操作,注意在Callback里面调用EndInvoke,//否则可能会有资源泄漏a.BeginInvoke(20, ar =>{a.EndInvoke(ar);}, null);}
复制代码

  完成处理的代码可以跟在a.EndInvoke(ar);后面。注意:EndInvoke最好在会掉里面调用,不然可能会造成资源泄漏,或某些内存无法回收。

 

2. 还是很土鳖的例子,异步读取一个文件添加行号然后打印
   这样在文件读取的IO操作过程中,CPU可以空出来做其他事情。
   

复制代码
    public class AddLineNum{/// <summary>/// 异步方式读取文件并加行号显示/// /// 总共分三步:/// 1. 前期准备工作,开始读文件,使用当前线程执行/// 2. 文件异步读取,这个步骤将不占用线程和CPU资源/// 3. 读取数据处理和显示,在第三个线程里执行/// </summary>/// <param name="file"></param>public AddLineNum(string file){_file = file;}/// <summary>/// 1. 开始读取文件/// </summary>public void Begin(){long fileSize = new FileInfo(_file).Length;_buffer = new byte[fileSize];FileStream reader = File.OpenRead(_file);reader.BeginRead(_buffer, 0, (int)fileSize, ar =>{int count = reader.EndRead(ar);Console.WriteLine("Read length:{0}", count);End();//处理读取数据}, null);}/// <summary>///  2.  处理读到的数据/// </summary>private void End(){string text = Encoding.UTF8.GetString(_buffer);string[] lines = text.Split(new string[]{Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries);for (int i = 0; i < lines.Length; ++i){Console.WriteLine(String.Format("{0}:{1}", i, lines[i]));}}private string _file = "";private byte[] _buffer = null;}
复制代码

调用代码:

     AddLineNum apmOne = new AddLineNum("AddLineNum.cs");apmOne.Begin();

如注释里面所说,在处理文件读取时不占用CPU,异步带来的好处。

    

3. 稍微不土鳖的例子,同时开始多个web请求,在所有请求结束时汇总结果
   

复制代码
   public class CheckSiteStatus{public CheckSiteStatus(IList<string> sites){_sites = sites;}public void Begin(){_finishedCount = _sites.Count;foreach (string site in _sites){HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://" + site);req.Method = "HEAD";req.BeginGetResponse(ar =>{HttpWebRequest request = ar.AsyncState as HttpWebRequest;try{HttpWebResponse res = (HttpWebResponse)(request.EndGetResponse(ar));_statusDic[request.RequestUri.Host] = res.StatusCode;}catch (WebException exp){HttpWebResponse errRes = exp.Response as HttpWebResponse;if (errRes != null){_statusDic[request.RequestUri.Host] = errRes.StatusCode;}else{_statusDic[request.RequestUri.Host] = HttpStatusCode.NotFound;}}//完成一个Interlocked.Decrement(ref _finishedCount);if (_finishedCount <= 0)End();}, req);}}private void End(){int goodCount = 0;foreach (var pair in _statusDic){if (pair.Value == HttpStatusCode.OK){++goodCount;}Console.WriteLine("site:{0}, status:{1}", pair.Key, pair.Value);}Console.WriteLine("{0} of {1} can be connected.", goodCount, _statusDic.Keys.Count);}private Dictionary<string, HttpStatusCode> _statusDic = new Dictionary<string, HttpStatusCode>();private IList<string> _sites;private int _finishedCount = 0;}
复制代码

调用代码:

复制代码
        CheckSiteStatus checker = new CheckSiteStatus(new string[] {"www.baidu.com","www.google.com","www.soso.com","www.idiot.com/"});checker.Begin();
复制代码

例子中用_finishedCount跟踪执行完成个数,然后用Interlocked的方法实现同步控制。

 

4. 和上面例子3实现的功能相同,本土鳖常用的方法,主线程会阻塞浪费点CPU,但是代码更简洁清楚。

复制代码
    class CheckSiteStatus2{public static void Check(IList<string> sites){//:开始请求Dictionary<string, HttpWebRequest> reqs = new Dictionary<string, HttpWebRequest>();Dictionary<string, IAsyncResult> asyncs = new Dictionary<string,IAsyncResult>();foreach (string site in sites){HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://" + site);req.Method = "HEAD";reqs[site] = req;asyncs[site] = req.BeginGetResponse(null, null);}//:结束请求,更新状态Dictionary<string, HttpStatusCode> statusDic = new Dictionary<string, HttpStatusCode>();foreach (var pair in asyncs){HttpWebRequest request = reqs[pair.Key];try{HttpWebResponse res = (HttpWebResponse)(request.EndGetResponse(pair.Value));statusDic[request.RequestUri.Host] = res.StatusCode;}catch (WebException exp){HttpWebResponse errRes = exp.Response as HttpWebResponse;if (errRes != null){statusDic[request.RequestUri.Host] = errRes.StatusCode;}else{statusDic[request.RequestUri.Host] = HttpStatusCode.NotFound;}}}//:全部处理完时汇总处理int goodCount = 0;foreach (var pair in statusDic){if (pair.Value == HttpStatusCode.OK){++goodCount;}Console.WriteLine("site:{0}, status:{1}", pair.Key, pair.Value);}Console.WriteLine("{0} of {1} can be connected.", goodCount, statusDic.Keys.Count);}}
复制代码

调用代码:

复制代码
CheckSiteStatus2.Check(new string[] {"www.baidu.com","www.google.com","www.soso.com","www.idiot.com/"});
复制代码

上面直接在一个静态方法里面用一段代码实现,各个步骤也比较清楚。

这篇关于有关.Net微信三公棋牌开发异步处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245529

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get