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

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

}

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王甜甜(.NET)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值