.Net关于线程THREAD TASK ASYNC&AWAIT

今天在写多线程同步执行一个接口时,用到了AutoResetEvent这东西。因为很久没写C#,(都在写OC),忘记了。所以打算写篇文章记录关于线程的内容。大致是借鉴了博客文章async & await 的前世今生.


区别:

Thread(.Net1.0出现,创建不会再线程池,没有返回值)

Task(.Net4.0出现,4.5引入Run方法,默认会直接使用线程池)

async & await(.Net4.5出现)


创建:


.Net关于线程THREAD TASK ASYNC&AWAIT_第1张图片

注意:如果我们不使用Task,又想用线程池的话,可以使用ThreadPool类。Thread是不会放到线程池的


共享数据

在使用多线程的时候经常会碰到,多个线程需要使用一个资源对象,这样就会造成这资源对象混乱。所以需要多线程同步(串行执行,等待执行)。

方法其实很多:

a.全局变量判断是否进入

b,lock

c,线程阻塞:信号量(AutoResetEvent,ManualResetEvent,Semaphore)

lock的话一般会用在内存只分配一次的变量上。一般是全局的静态变量

信号量的用法比较简单,set()通知可以让下一个进程执行啦,waitone()让下一个线程等待,至于这三个的区别,这里不详细说。


异步等待async & await


.Net关于线程THREAD TASK ASYNC&AWAIT_第2张图片


.Net关于线程THREAD TASK ASYNC&AWAIT_第3张图片

流程解释:

1.进入Main()方法,执行DisplayValue()方法,原本应该等待DisplayValue()方法执行完毕再往下执行输出代码,但是DisplayValue()方法修饰了async,这就表示异步去执行这个方法。所以是并发的。即输出”MyClass() End.”,同时还在执行DisplayValue()方法。

2.在进入DisplayValue()方法时,按理说:应该马上输出“”Value is :result",但是看到await修饰的GetValueAsync()方法。所以必须等待GetValueAsync()方法完成后才能执行下一句代码。

你可能感兴趣的:(.Net关于线程THREAD TASK ASYNC&AWAIT)