test02.ProntOut(); ///*第五题*/ static class test02 { public static async void ProntOut() { Console.WriteLine("80行:" + Thread.CurrentThread.ManagedThreadId.ToString()); Func<Task> doit = async () => { Console.WriteLine("83行:" + Thread.CurrentThread.ManagedThreadId.ToString()); Console.WriteLine(111); var task = Task.Run(async () => { Console.WriteLine("87行:" + Thread.CurrentThread.ManagedThreadId.ToString()); //await Task.Delay(3000); Thread.Sleep(3000); Console.WriteLine(222); }); await task; Console.WriteLine(333); Console.WriteLine("94行:" + Thread.CurrentThread.ManagedThreadId.ToString()); }; Console.WriteLine("96行:" + Thread.CurrentThread.ManagedThreadId.ToString()); await doit(); Console.WriteLine("98行:" + Thread.CurrentThread.ManagedThreadId.ToString()); Thread.Sleep(5000); } }
Task更完美写法优化
应当改为
这样可以减少线程的切换,线程切换也很消耗资源
如果要 获取新增完的id 在给第二个新增做关联,可以考虑
1,不要使用自增主键,在程序里面直接生成guid,赋值
2,efcore,使用了外键导航,同时插入数据时子表的外键能自动关联到主表
可以改为
应该直接把task返回,是否异步交给调用者决定
查完直接用的没毛病
不过可以这么优化一下更完美
Task.WhenAll用法
使用await Task.WhenAll
而不是多个独立的await
的原理在于并行性和性能优化。Task.WhenAll
允许同时等待多个任务完成,提高异步操作的效率。
方法
-
多个
await
方式 -
每个任务独立
await
,按顺序等待每个任务完成。 -
await Task.WhenAll
方式 -
通过
Task.WhenAll
同时等待多个任务的完成。
步骤
-
多个
await
方式 -
依次使用
await
等待每个任务的完成。 -
await Task.WhenAll
方式 -
使用
Task.WhenAll
将多个任务包装在一起,通过单一的await
等待所有任务完成。
using System; using System.Threading.Tasks; class Program { static async Task Main() { // 示例任务 Task<int> task1 = Task.Delay(1000).ContinueWith(_ => 1); Task<int> task2 = Task.Delay(2000).ContinueWith(_ => 2); // 多个 await 方式 int result1 = await task1; int result2 = await task2; Console.WriteLine($"多个 await 方式:{result1}, {result2}"); // await Task.WhenAll 方式 Task<int[]> whenAllTask = Task.WhenAll(task1, task2); int[] results = await whenAllTask; Console.WriteLine($"await Task.WhenAll 方式:{results[0]}, {results[1]}"); } }
注意事项及建议
-
并行性
-
使用
Task.WhenAll
可以在多个任务之间实现并行性,提高性能。 -
异常处理
-
考虑异步操作中可能发生的异常,适当处理异常情况。
-
资源释放
-
使用
Task.WhenAll
时,确保合理释放资源,防止潜在的资源泄漏。
通过使用await Task.WhenAll
而不是多个独立的await
,可以在异步操作中实现并行性,提高性能。选择合适的方式取决于具体情况,但在需要同时等待多个任务完成的场景中,Task.WhenAll
通常是更为高效的选择。优化异步操作能够提升整体程序性能,特别在处理大量任务时尤为重要。