异步解释:(个人专属理解,可能有bug)
比如一个异步方法里面有三句话,先执行其中第一句话,若执行到第二句话时的时间较长,
便会开辟多一个线程,一边执行异步方法里的第二句话,一边又执行异步方法外面的方法,
等到异步方法里面的第二句话完全执行完再跳进异步方法里面执行第三句话
(这个一边。。。一边。。。就是异步的特点)
举个小李子:
class Program { static void Main(string[] args) { new Program().OpenMainsSwitch(); Console.ReadKey(); } public void OpenMainsSwitch() { Console.WriteLine("普通的同步{0}", GetCurrentThreadID()); Task task = CommandOpenMainsSwitch(); Console.WriteLine("同步方法第一句话{0}", GetCurrentThreadID()); Console.WriteLine("同步方法第二句话{0}", GetCurrentThreadID()); task.Wait(); //阻塞带有await的异步方法即阻塞异步方法第二句话,直到第二句话执行完再执行其他 ////或者 //while (!task.IsCompleted) { Thread.Sleep(100); } Console.WriteLine("同步方法第三句话{0}", GetCurrentThreadID()); } public async Task CommandOpenMainsSwitch() { Console.WriteLine("执行异步方法的的第一句话{0}", GetCurrentThreadID()); await Task.Run(() => { Console.WriteLine("执行异步方法的的第二句话", GetCurrentThreadID()); Thread.Sleep(3000); }); Console.WriteLine("执行异步方法的的第三句话{0}", GetCurrentThreadID()); Thread.Sleep(6000); Console.WriteLine("执行异步方法的的第四句话{0}", GetCurrentThreadID()); } public string GetCurrentThreadID() { return Thread.CurrentThread.ManagedThreadId.ToString("00"); } }
一开始运行:直接执行到
普通的同步01
执行异步方法的的第一句话01
同步方法第一句话01
执行异步方法的的第二句话
同步方法第二句话01
等待3秒后,即Thread.Sleep(3000);,才会输出:执行异步方法的的第三句话
因为有task.Wait(); 阻塞线程,所以死活都要休眠6秒即Thread.Sleep(6000);,输出:执行异步方法的的第四句话
后才能输出:同步方法第三句话
大佬总结与博客:https://www.cnblogs.com/wcrBlog/p/11690460.html
3. Task 分为两种:
1) Task,表示可以执行一个异步操作,声明如下:
public class Task : IAsyncResult, IDisposable { }
2) Task<TResult>,表示可以执行带有返回值的异步操作,声明如下:
public class Task<TResult> : Task { }
4. 异步方法的返回类型必须为 void、Task、Task<TResult> 中的其中一种。
1) void,表示无返回值,不关心异步方法执行后的结果,一般用于仅仅执行某一项任务,但是不关心结果的场景。
2) Task,表示异步方法将返回一个 Task 对象,该对象通常用于判断异步任务是否已经完成,可以使用 taskObj.Wait() 方法等待,或者 taskObj.IsCompleted 判断。
3) Task<TResult>,表示异步方法将返回一个 Task<TResult> 对象,该对象的 Result 属性则是异步方法的执行结果,调用该属性时将阻塞当前线程(异步方法未执行完成时)。
归纳一下:void 不关心结果;Task 只关心是否执行完成;Task<TResult> 不止关心是否执行完成,还要获取执行结果。