今天在写多线程同步执行一个接口时,用到了AutoResetEvent这东西。因为很久没写C#,(都在写OC),忘记了。所以打算写篇文章记录关于线程的内容。大致是借鉴了博客文章async & await 的前世今生.
区别:
Thread(.Net1.0出现,创建不会再线程池,没有返回值)
Task(.Net4.0出现,4.5引入Run方法,默认会直接使用线程池)
async & await(.Net4.5出现)
创建:
注意:如果我们不使用Task,又想用线程池的话,可以使用ThreadPool类。Thread是不会放到线程池的
共享数据
在使用多线程的时候经常会碰到,多个线程需要使用一个资源对象,这样就会造成这资源对象混乱。所以需要多线程同步(串行执行,等待执行)。
方法其实很多:
a.全局变量判断是否进入
b,lock
c,线程阻塞:信号量(AutoResetEvent,ManualResetEvent,Semaphore)
lock的话一般会用在内存只分配一次的变量上。一般是全局的静态变量
信号量的用法比较简单,set()通知可以让下一个进程执行啦,waitone()让下一个线程等待,至于这三个的区别,这里不详细说。
异步等待async & await
流程解释:
1.进入Main()方法,执行DisplayValue()方法,原本应该等待DisplayValue()方法执行完毕再往下执行输出代码,但是DisplayValue()方法修饰了async,这就表示异步去执行这个方法。所以是并发的。即输出”MyClass() End.”,同时还在执行DisplayValue()方法。
2.在进入DisplayValue()方法时,按理说:应该马上输出“”Value is :result",但是看到await修饰的GetValueAsync()方法。所以必须等待GetValueAsync()方法完成后才能执行下一句代码。
网友评论