C# Web页面多线程任务

一、使用线程池队列实现 

//创建线程池
ThreadPool.SetMaxThreads(10, 10);
//多线程队列执行任务
foreach (var openid in openidList.GetRange(100, 100))
{
    ThreadPool.QueueUserWorkItem(id =>
    {
        try
        {
            //具体任务
        }
        catch (Exception eX)
        {
            ShowInPage(0, "出错:" + eX.Message);
            WriteErrorLog("出错:", eX);
        }
    }, openid);
}

 三、使用Task排队任务队列实现

//线程数
int num = 10;
Task[] tasks = new Task[num];
//执行数
int countR = 0;
int countU = 0;
//任务游标
int listIndex = 0;

for (int n = 0; n < num; n++)
{
    tasks[n] = Task.Factory.StartNew(() =>
    {
        try
        {
            while (true)
            {
                //获取当前任务
                int openidIndex = 0;
                lock (BenRenTableEmpty)
                {
                    openidIndex = listIndex;
                    listIndex++;
                }
                //判断任务是否执行完毕
                if (openidIndex < openidList.Count)
                {
                   //执行任务
                }
                else
                {
                    break;
                }
            }
        }
        catch (Exception eX)
        {
            ShowInPage(0, "本线程出错" + Thread.CurrentThread.Name + ":" + eX.Message);
            WeiXinCustom.WXTools.WriteErrorLog("本线程出错" + Thread.CurrentThread.Name + ":", eX);
        }
    });
}
Task.WaitAll(tasks);

三、使用Task将任务队列分组实现

//线程数
int num = 10;
Task[] tasks = new Task[num];
//执行数量多线程分别计数
int[] arrCountR = new int[num];
int[] arrCountU = new int[num];
//单个线程任务数量
int taskcount = (openidList.Count / num-1) + 1;
//线程编号计数
int curIndex = 0;
//创建线程
for (int n = 0; n < num; n++)
{
    tasks[n] = Task.Factory.StartNew(() =>
    {
        //本线程编号
        int taskIndex = 0;
        try
        {
            lock (BenRenTableEmpty)
            {
                //取得线程编号
                taskIndex = curIndex;
                curIndex++;
            }

            //计算任务数量范围
            int beg = taskIndex * taskcount;
            int end = (taskIndex + 1) * taskcount;
            //防止溢出
            if (beg > openidList.Count)
            {
                beg = 0;
                end = 0;
            }
            else if (end > openidList.Count)
            {
                end = openidList.Count;
            }

            //计数
            arrCountR[taskIndex] = 0;
            arrCountU[taskIndex] = 0;

            //WriteLog("线程" + taskIndex + "任务:" + beg + "-" + end);
            //从列表获取线程任务
            List<string> taskList = new List<string>();
            taskList.AddRange(openidList.GetRange(beg, end - beg));

            taskList.ForEach(openid =>
            {
                //具体任务
            });
        }
        catch (Exception eX)
        {
            ShowInPage(0, "本线程出错" + taskIndex + ":" + eX.Message);
            WriteErrorLog("本线程出错" + taskIndex + ":", eX);
        }
    });
}
//等待多线程完成
Task.WaitAll(tasks);

//开始计算执行结果
int countR = 0;
int countU = 0;

for (int i = 0; i < num; i++)
{
    countR += arrCountR[i];
    countU += arrCountU[i];
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值