C# Task异步编程

Task任务用法:

Task用的是线程池,线程池的线程数量的有上限的,这个可以通过ThreadPool修改,我们经常会用到task.run ,new task ,和task.factory.startnew方法来创建任务。

Task.Factory.StartNew(action)不是直接创建线程,创建的是任务,它有一个任务队列,然后通过任务调度器把任务分配到线程池中的空闲线程中,任务是不能被直接执行的,只有分配给线程才能被执行,如果任务的数量比线程池中的线程多,线程池的线程数量还没有到达上限,就会创建新线程执行任务。如果线程池的线程已到达上限,没有分配到线程的任务需要等待有线程空闲的时候才执行。

task 是新建一个异步任务,这个任务是分配到子线程中去的,跟我们之前的new thread,创建线程很相似,在子线程中,通过SynchronizationContext类进行上下文同步,实现子线程和主线程之间的通信。

Task.Factory.StartNew(() =>
            {
                using (BillManagementClientProxy clientProxy = new BillManagementClientProxy())
                {
                    var dataList = clientProxy.GetBillCancelRequestInfos(queryConditions);
                    HistoryRecordInvalidInfos.Clear();
                    HistoryRecordInvalidInfos.AddRange(dataList);
                }
                synContext.Post((p =>
                {
                    this.gv_QueryData.RefreshData();
                    SetAllConditionCtrlEnble(true);
                    this.Hideloading(this.progressPanel1);
                }), null);
            });

task构造函数
这里写图片描述

task.run()重载

这里写图片描述

task 和 thread ,以及thread pool区别?
Task是将多个操作封装成一个概念上原子操作。但这个操作由哪个Thread甚至多个Thread来处理处理你并不清楚。总之就是可以被正常完成。
Thread仅仅是一条线程,所有操作都是这个Thread一个完成的。

thread是单核多线程,task是多核多线程

task 比thread pool 线程池优越的地方在于,在thread pool时期,我们不能知道一个workitem是否完成,也不能在完成后知道workitem所得出的返回值,task封装后解决了这个问题,并且可以清楚地知道返回值。

猜你喜欢

转载自blog.csdn.net/lnazj/article/details/79856898