Async Await (多线程等待) 用写单线程的方式写多线程
Task
n.
任务;(尤指艰巨或令人厌烦的)工作;(尤指语言教学中旨在帮助达到某一学习目的的)活动
vt.
交给某人(任务);派给某人(工作)
//async是修饰方法的:---如果只是在方法上写一个async--警告;---而且没有什么用处;
//awai是在方法内部的:---如果只在方法内部写await,没有async---报错
//async+awai配套使用的
//await后的代码会由线程池的线程执行 非阻塞 并发执行
//主线程到await这里就返回了,执行主线程任务 ,task中的任务执行完毕以后---继续执行await后面的后续内容,有可能是子线程,也有可能是其他线程,甚至有可能是主线程来执行;
原理是底层状态机的实现 有个 MoveNext方法
-------------------主线程--------------
private static async void NoReturnNoAwait()
{
//主线程执行
Task task = Task.Run(() =>//启动新线程完成任务
{
Thread.Sleep(1000);
Console.WriteLine($"NoReturnNoAwait Sleep3000 before,ThreadId={Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000);
Console.WriteLine($"NoReturnNoAwait Sleep3000 after,ThreadId={Thread.CurrentThread.ManagedThreadId}");
});
//主线程执行
Console.WriteLine($"NoReturnNoAwait Sleep after Task,ThreadId={Thread.CurrentThread.ManagedThreadId}");
}
------------------子线程无返回值---------
private static async Task NoReturnTask() //在async/await方法里面如果没有返回值,默认返回一个Task
{
//这里还是主线程的id
Console.WriteLine($"NoReturnTask Sleep before await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
Task task = Task.Run(() =>
{
Console.WriteLine($"NoReturnTask Sleep3000 before,ThreadId={Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000);
Console.WriteLine($"NoReturnTask Sleep3000 after,ThreadId={Thread.CurrentThread.ManagedThreadId}");
});
await task; //主线程到await这里就返回了,执行主线程任务 ,task中的任务执行完毕以后---继续执行await后面的后续内容,有可能是子线程,也有可能是其他线程,甚至有可能是主线程来执行;
Console.WriteLine($"NoReturnTask Sleep after await,ThreadId={Thread.CurrentThread.ManagedThreadId}");
//return;
//return new TaskFactory().StartNew(() => { }); //不能return 没有async才行
}
continueWith 类似于一个回调 意思是继续但是写的很不方便 这里可以和await task等价替换 /// <summary> /// 真的返回Task 不是async /// /// 要使用返回值就一定要等子线程计算完毕 /// </summary> /// <returns>没有async Task</returns> private static Task<int> SumFactory() { Console.WriteLine($"SumFactory 111 start ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); TaskFactory taskFactory = new TaskFactory(); Task<int> iResult = taskFactory.StartNew<int>(() => { Thread.Sleep(3000); Console.WriteLine($"SumFactory 123 Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); return 123; }).ContinueWith(c=> { Thread.Sleep(3000); Console.WriteLine($"SumFactory 234 Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); return 123; }).ContinueWith(t=> { Thread.Sleep(3000); Console.WriteLine($"SumFactory 345 Task.Run ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); return 123; }); //就是回调来控制线程内部的业务逻辑的执行顺序---不爽 //Console.WriteLine($"This is {iResult.Result}"); Console.WriteLine($"SumFactory 111 end ManagedThreadId={Thread.CurrentThread.ManagedThreadId}"); return iResult; }