C#编程高并发的几种处理方法

并发(英文Concurrency),其实是一个很泛的概念,字面意思就是“同时做多件事”,不过方式有所不同。在.NET的世界里面,处理高并发大致有以下几种方法:

1,异步编程

异步编程就是使用future模式(又称promise)或者回调机制来实现(Non-blocking on waiting)。如果使用回调或事件来实现(容易callback hell),不仅编写这样的代码不直观,很快就容易把代码搞得一团糟。

不过在.NET 4.5 及以上框架中引入的async/await关键字(在.NET 4.0中通过添加Microsoft.Bcl.Async包也可以使用),让编写异步代码变得容易和优雅。通过使用async/await关键字,可以像写同步代码那样编写异步代码,所有的回调和事件处理都交给编译器和运行时帮你处理了,简单好用。

使用异步编程有两个好处:不阻塞主线程(比如UI线程),提高服务端应用的吞吐量。所以微软推荐ASP.NET中默认使用异步来处理请求。

 如果你看到这段文字,说明您正使用RSS阅读或转自《一棵树-博客园》,原文地址:http://www.cnblogs.com/atree/p/Concurrency_Async.html 

例如:我用异步做微信模板消息推送。

/// <summary>
/// 使用异步Action测试异步模板消息接口
/// </summary>
/// <param name="checkcode"></param>
/// <returns></returns>
public async Task<string> TemplateMessageAsync(string openId, string first, string keyword1, string keyword2, string keyword3, string keyword4, string remark, string url)
{
    if (openId == null)
    {
        return ReturnString(7771, "OPENID不能为空");
    }
    else
    {
        var testData = new //TestTemplateData()
        {
            first = new TemplateDataItem(first),
            keyword1 = new TemplateDataItem(keyword1),
            keyword2 = new TemplateDataItem(keyword2),
            keyword3 = new TemplateDataItem(keyword3),
            keyword4 = new TemplateDataItem(keyword4),
            remark = new TemplateDataItem(remark)
        };

        var result = await TemplateApi.SendTemplateMessageAsync(_wechat.APPID, openId, "m6td4jp_heMA5rhopbUaHApOlp2DD5x18BMXWKj3M5U", url, testData);
        return ReturnString(0, "成功");
    }
}

 2,并行编程

并行编程的出现实际上是随着CPU有多核而兴起的,目的是充分利用多核CPU的计算能力。并行编程由于会提高CPU的利用率,更适合客户端的一些应用,对于服务端的应用可能会造成负面影响(因为服务器本身就具有并行处理的特点,比如IIS会并行的处理多个请求)。我自己使用并行编程最多的场景是之前分析环境数据不确定度的时候,使用并行的方式计算蒙特卡洛模拟(计算上千次之后拟合),当然后来我使用泰勒级数展开来计算不确定度,没有这么多的计算量就无需并行了。当然在计算多方案结果比较的情况下,还是继续使用了并发计算。

在.NET中,并行的支持主要靠.NET 4.0引入的任务并行库和并行LINQ。通过这些库可以实现数据并行处理(处理方式相同,输入数据不同,比如我上面提到的应用场景)或者任务并行处理(处理方式不同,且数据隔离)。通过使用并行处理库,你不用关心Task的创建和管理(当然更不用说底层的线程了),只需要关注处理任务本身就行了。

具体的用法还是参考官方文档:https://msdn.microsoft.com/en-us/library/dd460693(v=vs.110).aspx

3,响应式编程

响应式编程最近成为了一个Buzzword,其实微软6年前就开始给.NET提供一个Reactive Extensions了。一开始要理解响应式编程有点困难,但是一旦理解了,你就会对它的强大功能爱不释手。简单来说,响应式编程把事件流看作数据流,不过数据流是从IEnumable中拉取的,而事件流是从IObservable推送给你的。为什么响应式编程可以实现并发呢?这是因为Rx做到线程不可知,每次事件触发,后续的处理会从线程池中任意取出一个线程来处理。且可以对事件设置窗口期和限流。举个例子,你可以用Rx来让搜索文本框进行延迟处理(而不用类似我很早的时候用个定时器来延迟了)。

要详细了解Rx最好的方式就是浏览 IntroToRx.com 这个网站,当然还有官方文档:https://msdn.microsoft.com/en-us/data/gg577609。

4,数据流编程

数据流(DataFlow)编程可能大家就更陌生了,不过还是有些常用场景可以使用数据流来解决。数据流其实是在任务并行库(TPL)上衍生出来的一套处理数据的扩展(也结合了异步的特性),TPL也是处理并行编程中任务并行和数据并行的基础库。

望文生义,TPL DataFlow就是对数据进行一连串处理,首先为这样的处理定义一套网格(mesh),网格中可以定义分叉(fork)、连接(join)、循环(loop)。数据流入这样的处理网格就能够并行的被处理。你可以认为网格是一种升级版的管道,实际上很多时候就是被当作管道来使用。使用场景可以是“分析文本文件中词频”,也可以是“处理生产者/消费者问题”。

参考资料当然也是官方文档:https://msdn.microsoft.com/en-us/library/hh228603(v=vs.110).aspx。

5,Actor模型

Scala有Akka,其实微软研究院也推出了Orleans来支持了Actor模型的实现,当然也有Akka.NET可用。Orleans设计的目标是为了方便程序员开发需要大规模扩展的云服务, 可用于实现DDD+EventSourcing/CQRS系统。

官方网站是:http://dotnet.github.io/orleans/

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Modbus是一种通信协议,用于在工业自动化系统中传输数据。Modbus TCP是基于TCP/IP网络协议的Modbus协议的一个变种。 Modbus TCP C是使用C编程语言来实现Modbus TCP协议的一种方法。C语言是一种面向过程的编程语言,被广泛用于嵌入式系统和网络通信领域,因此使用C语言来实现Modbus TCP可以实现较高的性能和灵活性。 实现Modbus TCP C的主要步骤包括以下几个方面: 1. 引入相应的C语言库:为了使用C语言来解析Modbus TCP协议,需要引入一些相关的C语言库,这些库可以提供Modbus TCP协议的解析函数和数据结构。 2. 创建TCP连接:使用C语言的网络编程库,如socket库,可以创建TCP连接,与Modbus TCP服务器建立通信通道。 3. 构建Modbus TCP请求:根据Modbus TCP协议的规范,构建相应的Modbus TCP请求报文,并发送给Modbus TCP服务器。 4. 解析Modbus TCP响应:接收Modbus TCP服务器返回的响应报文,使用C语言库中的函数解析响应报文,获取所需的数据。 5. 处理数据:根据需求对获取的数据进行处理,如存储、加工和显示等。 6. 关闭TCP连接:当通信结束后,使用C语言库中的相应函数关闭TCP连接,释放资源。 总之,使用C语言实现Modbus TCP协议需要理解Modbus TCP协议的规范和C语言的网络编程知识。通过合理的编程和调试,可以成功实现Modbus TCP协议的数据通信。 ### 回答2: Modbus是一种通信协议,用于在不同设备之间进行数据传输和通信。Modbus TCP是一种在以太网上使用Modbus协议的变种。C是一种编程语言,可用于开发Modbus TCP通信的软件。 Modbus TCP C是使用C编程语言来开发和实现Modbus TCP通信的一种方法。开发者可以使用C语言编写程序代码来建立与Modbus从设备的连接,发送和接收数据,并进行相关的操作。 Modbus TCP C可以实现数据的读取和写入,例如读取传感器的数据或者控制设备的状态。通过建立与Modbus从设备的连接,使用C编程语言可以比较方便地实现数据的监控和控制。 使用C编程语言进行Modbus TCP通信需要掌握Modbus的相关知识,并了解C语言的基础知识。开发者需要使用相应的库函数或者开发工具来实现Modbus TCP的功能。 总结来说,Modbus TCP C是一种使用C语言开发和实现Modbus TCP通信的方法,能够实现设备之间的数据传输和通信。开发者需要掌握Modbus和C语言的知识,并利用适当的库函数或者开发工具来编写程序代码实现相关功能。 ### 回答3: Modbus TCP是一种基于以太网的Modbus通信协议,它使用TCP/IP协议族进行数据传输。Modbus TCP允许设备在局域网或互联网上通过TCP/IP网络相互通信。 在C语言中,可以使用一些第三方库或者自行编写代码来实现Modbus TCP通信。以下是一个简单的示例: 首先,需要包含相关的头文件: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <modbus/modbus.h> 然后,需要初始化一个Modbus连接: int main() { modbus_t *ctx; // 创建Modbus TCP连接 ctx = modbus_new_tcp("192.168.0.1", 502); if (ctx == NULL) { printf("Modbus TCP连接创建失败\n"); return -1; } // 设置从站ID(通常为1) modbus_set_slave(ctx, 1); // 连接到从站 if (modbus_connect(ctx) == -1) { printf("Modbus TCP连接失败\n"); modbus_free(ctx); return -1; } // 连接成功,可以进行数据读写操作 // 读取保持寄存器中的数值 uint16_t reg_value; modbus_read_registers(ctx, 0, 1, &reg_value); // 写入保持寄存器中的数值 uint16_t new_value = 12345; modbus_write_register(ctx, 0, new_value); // 关闭Modbus连接 modbus_close(ctx); modbus_free(ctx); return 0; } 以上代码中,通过modbus_new_tcp()函数创建了一个Modbus TCP连接。然后,使用modbus_set_slave()函数设置从站ID,并通过modbus_connect()函数连接到从站。之后,可以使用modbus_read_registers()函数读取保持寄存器中的数据,或使用modbus_write_register()函数向保持寄存器写入数据。最后,通过modbus_close()和modbus_free()函数关闭和释放Modbus连接。 这只是一个简单的示例,实际的Modbus TCP通信可能需要更复杂的逻辑和功能。可以根据具体的需求,在C语言中编写相应的代码来实现更复杂的Modbus TCP通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值