异步编程
异步编程。
http://www.cnblogs.com/mingjiatang/p/5267391.html
-
在.net中如何使用多线程和异步函数来解决计算限制、耗时等这些不友好用户体验的问题。
-
异步编程中比较关心,也是比较重要的技术点在于,1)当异步线程在工作完成时如何通知调用线程,2)当异步线程出现异常的时候该如何处理,3)异步线程工作的进度如何实时的通知调用线程。4)如何在调用线程中取消正在工作的异步线程,并进行回滚操作。
-
用WorkPro方法实例化一个DoWork类型的对象d
-
异步函数内部所使用的线程均是线程池中的工作线程,由线程池去分配管理的。
-
在.net还提供许多类的BeinXXX()和EndXXX()的异步版本,比如文件的读写等,具体可以查阅相关的资料。
-
建立一个专用线程是非常耗用系统的资源,建议是使用线程池中的线程。
-
Thread类的使用虽然简单,但是它还是有一定的劣势的,一般不推荐使用。
1)Thread类创建的是一个专用线程,建立一个专用线程是非常耗用系统的资源,建议是使用线程池中的线程。
2)Thread类不能很好的和调用线程进行交互,当任务完成时不能及时的通知,在调用线程也不能随时的取消正在进行的任务。
另外在以下情况下,就只能选择使用Thread类了。
1)执行任务的线程要以非普通的优先级去执行,因为线程池的线程都是以普通优先级运行的。
2)执行任务的线程要表现为一个前台线程,因为线程池的线程始终都是一个后台线程。
3)异步执行的任务需要长时间的,那么就可以使用Thread类为该任务建立一个专用线程。 -
Task
如果需要异步函数有返回值,那么此时就需要使用Task泛型类(派生自Task)来实现,其中TResult代表返回的类型。
我们还可以传递一些TaskCreationOptions标志来控制Task的执行方式 -
在Winform窗体程序设计中TaskScheduler尤为有用,为什么这么说呢?因为在窗体程序中的控件都是有ui线程去创建,而我们所执行的后台任务使用线程都是线程池中的工作线程,所以当我们的任务完成之后需要反馈到Winform控件上,但是控件创建的线程和任务执行的线程不是同一个线程,如果在任务线程中去更新控件就会导致控件对象安全问题会出现异常。所以操作控件,就必须要使用ui线程去操作。
-
因此在ContinueWith获取任务执行的结果的并反馈到控件的任务调度上不能使用线程池任务调用器,而要使用同步上下文任务调度器去调度,即采用ui这个线程去调用ContinueWith方法所绑定的回调用函数即Action
类型的委托