多线程+队列处理数据集合

//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);
}
}
}

}

 

posted @ 2023-07-18 10:44  W(王甜甜)  阅读(39)  评论(0编辑  收藏  举报