多线程+队列处理数据集合
//var users = new List<UserInfo>();
//for (int i = 0; i < 200000; i++)
//{
// users.Add(new UserInfo
// {
// ID = i,
// Name = "张三" + i.ToString(),
// Age = "16",
// Remark = "",
// });
//}
//var userinfos = new List<UserInfo>();
//userinfos.Add(new UserInfo
//{
// ID = 0,
// Name = "张三1000",
// Age = "26",
// Remark = "Remark-张三1000",
//});
//userinfos.Add(new UserInfo
//{
// ID = 0,
// Name = "张三30000",
// Age = "26",
// Remark = "Remark-张三30000",
//});
//for (int i = 0; i < 62000; i++)
//{
// userinfos.Add(new UserInfo
// {
// ID = 1,
// Name = "张三daasd",
// Age = "26",
// Remark = "",
// });
//}
//Console.WriteLine(DateTime.Now.ToString());
//不用线程直接处理
//foreach (var item in users)
//{
// var m = userinfos.FindAll(t => t.Name == item.Name).Select(t => t.Name);
// if (m.Count() > 0)
// {
// var n = users.Find(t => t.Name == item.Name);
// n.Remark = string.Join(" ", m); ;
// }
//}
//总结:单线程用Queue
//多线程+队列 ConcurrentQueue(先进先出) debug模式下:32s release模式下:8s
//ThreadConcurrentQueue.ExecuteTransaction(users, userinfos);
//多线程+队列 BlockingCollection(限制元素个数)debug模式下:33s release模式下:8s
//ThreadBlockingCollection.ExecuteTransaction(users, userinfos);
//多线程+队列 ConcurrentStack(后进后出) debug模式下:27s release模式下:8s
//ThreadConcurrentStack.ExecuteTransaction(users, userinfos);
//Console.WriteLine(DateTime.Now.ToString());
//foreach (var item in users)
//{
// if (!string.IsNullOrWhiteSpace(item.Remark))
// {
// Console.WriteLine(item.Remark);
// }
//}
----------------------------------------
public static class ThreadBlockingCollection
{
/// <summary>
/// 线程总数
/// </summary>
private static int threadNum = 10;
/// <summary>
/// 已处理
/// </summary>
private static int index = 0;
/// <summary>
/// 队列
/// </summary>
private static BlockingCollection<UserInfo> queues = new BlockingCollection<UserInfo>();
private static readonly object Lock = new object();
/// <summary>
/// 执行
/// </summary>
/// <param name="list"></param>
/// <param name="users"></param>
public static void ExecuteTransaction(List<UserInfo> list, List<UserInfo> users)
{
//添加队列
foreach (var item in list)
{
queues.Add(item);
}
//添加完成
queues.CompleteAdding();
//添加线程任务
List<Task> tasks = new List<Task>();
for (int i = 0; i < threadNum; i++)
{
var task = Task.Run(() =>
{
//业务
Process(users);
});
tasks.Add(task);
}
var taskList = Task.Factory.ContinueWhenAll(tasks.ToArray(), (ts) => { });
taskList.Wait();
}
/// <summary>
/// 业务处理(抢锁/TryEnter:不会出现死锁情况)
/// </summary>
/// <param name="users"></param>
private static void Process(List<UserInfo> users)
{
while (true)
{
UserInfo user = null;
var isExit = queues.TryTake(out user);
if (!isExit)
{
break;
}
try
{
Monitor.TryEnter(Lock);
var m = users.FindAll(t => t.Name == user.Name).Select(t => t.Name);
if (m.Count() > 0)
{
user.Remark = string.Join(" ", m); ;
}
Monitor.Exit(Lock);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
--------------------------------------
public static class ThreadConcurrentQueue
{
/// <summary>
/// 线程总数
/// </summary>
private static int threadNum = 10;
/// <summary>
/// 队列
/// </summary>
private static ConcurrentQueue<UserInfo> queues = new ConcurrentQueue<UserInfo>();
/// <summary>
/// 执行
/// </summary>
/// <param name="list"></param>
/// <param name="users"></param>
public static void ExecuteTransaction(List<UserInfo> list, List<UserInfo> users)
{
//添加队列
foreach (var item in list)
{
queues.Enqueue(item);
}
//添加线程任务
List<Task> tasks = new List<Task>();
for (int i = 0; i < threadNum; i++)
{
var task = Task.Run(() =>
{
//业务
Process(users);
});
tasks.Add(task);
}
var taskList = Task.Factory.ContinueWhenAll(tasks.ToArray(), (ts) => { });
taskList.Wait();
}
/// <summary>
/// 业务处理
/// </summary>
/// <param name="users"></param>
private static void Process(List<UserInfo> users)
{
while (true)
{
UserInfo user = null;
var isExit = queues.TryDequeue(out user);
if (!isExit)
{
break;
}
try
{
var m = users.FindAll(t => t.Name == user.Name).Select(t => t.Name);
if (m.Count() > 0)
{
user.Remark = string.Join(" ", m); ;
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
---------------------------------------
public static class ThreadConcurrentStack
{
/// <summary>
/// 线程总数
/// </summary>
private static int threadNum = 10;
/// <summary>
/// 队列
/// </summary>
private static ConcurrentStack<UserInfo> queues = new ConcurrentStack<UserInfo>();
/// <summary>
/// 执行
/// </summary>
/// <param name="list"></param>
/// <param name="users"></param>
public static void ExecuteTransaction(List<UserInfo> list, List<UserInfo> users)
{
//添加队列
queues.PushRange(list.ToArray());
//添加线程任务
List<Task> tasks = new List<Task>();
for (int i = 0; i < threadNum; i++)
{
var task = Task.Run(() =>
{
//业务
Process(users);
});
tasks.Add(task);
}
var taskList = Task.Factory.ContinueWhenAll(tasks.ToArray(), (ts) => { });
taskList.Wait();
}
/// <summary>
/// 业务处理
/// </summary>
/// <param name="users"></param>
private static void Process(List<UserInfo> users)
{
while (true)
{
UserInfo user = null;
var isExit = queues.TryPop(out user);
if (!isExit)
{
break;
}
try
{
var m = users.FindAll(t => t.Name == user.Name).Select(t => t.Name);
if (m.Count() > 0)
{
user.Remark = string.Join(" ", m); ;
}
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架