概述
一、使用线程池队列实现
//创建线程池
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];
}
最后
以上就是愉快钢笔为你收集整理的C# Web页面多线程任务的全部内容,希望文章能够帮你解决C# Web页面多线程任务所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复