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;
}
浙公网安备 33010602011771号