前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#多线程并发处理的问题

C#多线程并发处理的问题

作者头像
徐大嘴
发布2019-03-21 10:34:06
5.7K0
发布2019-03-21 10:34:06
举报
文章被收录于专栏:大嘴说编程大嘴说编程

公司某业务,需要按条来处理大批量数据,大概几万条到几十万条都有可能。这个是由另外一个同事写的,写完之后测试,速度、效率都非常低。我问了下,原来是直接拿这些数据进行循环处理,之后又把有问题的数据循环入库。

这就有两个瓶颈,一个是单线程处理数据,另一个就是又一次循环入库。

我给出的建议是,处理数据部分多线程,处理完数据之后直接把有问题的数据入库。可是同事用不明白多线程,那好吧,我给写个Demo吧。

这里需要用到队列(Queue)和Task或Thread。我这里使用的是ConcurrentQueue,ConcurrentQueue队列是一个高效的线程安全的队列,是.Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构。

首先,实例化一个队列,名为queue:

private ConcurrentQueue<Models.Demo> queue;

之后,给这个队列填充上测试用的数据:

代码语言:javascript
复制
//生成测试用数据列表
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);    //这里是随机数生成时需要
}

下面是处理启用多线程来处理数据了

代码语言:javascript
复制
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://cloud.tencent.com/developer/article/1405662

转载时须注明出处及本声明

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档