Task - 多线程 基于TreedPool
什么时候用多线程呢?
任务能够并发运行,使用后可以提升速度,优化体验
创建形式:
1、Task.Run(()=>this.方法名(参数字));
2、TaskFactory taskFactory = Task.Factory;
taskFactory.StartNew(()=>this.方法名(参数));
3、new Task(()=>this.方法名(参数)).Start();
方法:
Task.WaitAny(Task.ToArray(),最大等待时间)
阻塞当前线程,等某个线程的任务完成后,才执行后面的操作。-卡界面
Task.WaitAll(Task.ToArray(),最大等待时间)
阻塞当前线程,等放入的全部线程都完成后,才执行后面的操作。-卡界面
注:阻塞线程可以判断,判断是哪个线程,卡主线程会卡界面,但是我们可以卡子线程啊
Task.WhenAll(Task.ToArray()).ContinueWith( 方法);
启动线程,当全部线程完成后就调用ContinueWith中的方法。-不卡界面
Task.WhenAny(Task.ToArray()).ContinueWith(方法);
启动线程,当某个线程完成后就调用ContinueWith中的方法。-不卡界面
Task.Delay(1000).continueWith(方法);
创建将在延迟时间后进行的操作方法。 - 不会卡线程
问题
怎么查看该线程是由谁完成的呢?
利用TaskFactory,初始化的时候,设置的第二个参数为你的标识,查看使用
AsyncState
限制线程数不超过11 代码:
List<Task> taskList = new List<Task>();
foreach(var i in list){
int k = i;
taskList.Add(Task.Run(()=>action.Invoke(k)));
if(taskList.Count>10)
{
Task.WaitAny(taskList.ToArray());
taskList = taskList.Where(t=>t.Startus != TaskStatus.RanToCompletion).ToList();
}
}
Task.WhenAll(taskList.ToArray());