ThreadPool
1.循环列表,多线程执行
List<Action> actions = new List<Action>();
actions.Add(() => Console.WriteLine("HH"));
actions.Add(() => Console.WriteLine("CC"));
actions.Add(() => Console.WriteLine("BB"));
//这样写不对。 因为threadpool是异步操作。相当于开了一个线程,把方法放在异步执行。
//会看到有重复的数据 。
foreach (var action1 in actions)
{
ThreadPool.QueueUserWorkItem(state => action1(), null);
}
要改为如下
//可以正常输出
foreach (var action1 in actions)
{
var item = action1;
ThreadPool.QueueUserWorkItem(state => item(), null);
}
Parallerl控制并行数量
列表中有多个用户。我只开启两个并行,new ParallelOptions(){MaxDegreeOfParallelism = 2
Parallel.ForEach(relaList,new ParallelOptions(){MaxDegreeOfParallelism = 2}, x =>
{
try
{
CalcualteUser(true, DateTime.Now, x.RaceId, x.UserId, false);
}
catch (Exception ex)
{
LogUtility.WriteLog(string.Format("计算出现异常,跳过用户{0},原因:{1}....", x.UserId,ex.Message));
}
});
界面如下:
要区分异步和多线程的关系 ,多线程如果放在主线程上调用就会卡界面,一般要在异步中去执行。这样才不会卡界面 。
还不快抢沙发