背景:做NX二次开发的时候收集了NX操作的操作日志,然后用winform做了个应用读取分析这些日志。每天会积累超过5000多份日志,所以想到了异步编程来解决速度和卡死的问题。
一、异步编程和多线程的异同
硬件里有个概念叫DMA,也就是直接访问内存不经过CPU处理,这正是异步操作的硬件基础。异步编程无需额外的线程负担,死锁的情况也少,但是和自然人的思维方式有些不一样。而多线程中的各个线程的代码还是顺序执行的,自然人理解起来简单一些,但是线程的滥用反而会造成很多问题。
所以适用场合分别为:
异步:直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用
多线程:需要长时间CPU运算的场合
二、异步函数简介
直接用<C# in Depth>的介绍:
async Task<int> AsyncFunction()
{
var value = await SomeLongTimeFunction();
DoUpdateOrSomething();
}
用了async修饰符声明了的函数AsyncFunction中,用await修饰某个耗时操作的表达式SomeLongTimeFunction().如果SomeLongTimeFunction没有完成那么这个异步函数AsyncFunction会立即返回。当SomeLongTimeFunction执行完毕后,异步函数将在合适的线程上继续执行下面的语句
三、使用任务的异步编程
参考文章: