C#多线程并发处理的问题
时间:2022-06-19
本文章向大家介绍C#多线程并发处理的问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
公司某业务,需要按条来处理大批量数据,大概几万条到几十万条都有可能。这个是由另外一个同事写的,写完之后测试,速度、效率都非常低。我问了下,原来是直接拿这些数据进行循环处理,之后又把有问题的数据循环入库。 这就有两个瓶颈,一个是单线程处理数据,另一个就是又一次循环入库。 我给出的建议是,处理数据部分多线程,处理完数据之后直接把有问题的数据入库。可是同事用不明白多线程,那好吧,我给写个Demo吧。 这里需要用到队列(Queue)和Task或Thread。我这里使用的是ConcurrentQueue,ConcurrentQueue队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构。 首先,实例化一个队列,名为queue: private ConcurrentQueue<Models.Demo> queue; 之后,给这个队列填充上测试用的数据:
//生成测试用数据列表
for (int i = 1; i <= 50000; i++)
{
Models.Demo dat = new Models.Demo() { id = i, value = Libs.Rand.RndCode(8) };
queue.Enqueue(dat);
Thread.Sleep(1); //这里是随机数生成时需要
}
下面是处理启用多线程来处理数据了
int threadcount=10; //开启10个线程
for(int i=0;i<threadcount;i++)
{
string filename = string.Format("task{0}.txt", i);
filename = System.Web.HttpContext.Current.Request.MapPath(string.Format("~/file/{0}", filename));
Task.Factory.StartNew(() =>
{
Models.Demo demo = new Models.Demo();
StringBuilder sb = new StringBuilder();
int j = 0;
while (queue.TryDequeue(out demo))
{
//处理数据
if (demo != null)
sb.AppendLine(string.Format("{0}.{1}", demo.id, demo.value));
if (j % 100 == 0 || (queue.Count.Equals(0) && j<100))
{ //每100条写一次文件,并暂停100毫秒
Libs.FileObj.WriteFile(filename, sb.ToString());
sb = new StringBuilder();
Thread.Sleep(100);
}
j++;
}
});
}
这就搞定了。以上。
本文作者:老徐 本文链接:https://bigger.ee/archives/55.html 转载时须注明出处及本声明
- Python迭代
- Python爬虫(二十二)_selenium案例:模拟登陆豆瓣
- Python爬虫(二十三)_selenium案例:动态模拟页面点击
- Python爬虫(二十四)_selenium案例:执行javascript脚本
- Kubernetes服务网格(第10部分):服务网格API
- Python爬虫Scrapy(二)_入门案例
- python_IO编程
- Python爬虫(十七)_糗事百科案例
- 上千亿巨头撑腰 双拼妥妥被他拿了
- Python爬虫(十八)_多线程糗事百科案例
- Python爬虫(十九)_动态HTML介绍
- Python爬虫(二十)_动态爬取影评信息
- Python爬虫(二十一)_Selenium与PhantomJS
- Python爬虫(十三)_案例:使用XPath的爬虫
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 清空所有 NSUserDefaults 记录
- 重温Java Web的技术细节
- 国密算法SM2加解密_签名验签图形化例子
- 链接脚本linker script的妙用
- 【TBase开源版测评】轻松愉快去O选项:TBase
- Tungsten Fabric知识库丨更多组件内部探秘
- TRTC Android端开发接入学习之环境快速搭建(三)
- 为了满足UI小姐姐要求,自己动手实现了Android面包屑效果(支持Fragment联动)
- Jenkins持续集成「编译打包、代码检查、单元测试、环境部署、软件测试」
- 斗鱼直播带你实现:你主播最爱的Android音视频开发
- 深度解析Redis线程模型设计原理
- 聊聊claudb的hash command
- Exceptionless 5.x 无法正常发送邮件的问题解决
- 详解 Linux 中的硬链接与软链接
- 程序员进阶之算法练习(四十七)