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允许同时等待多个任务完成,提高异步操作的效率。

方法

  1. 多个await方式

    • 每个任务独立await,按顺序等待每个任务完成。

  2. await Task.WhenAll方式

    • 通过Task.WhenAll同时等待多个任务的完成。

步骤

  1. 多个await方式

    • 依次使用await等待每个任务的完成。

  2. 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通常是更为高效的选择。优化异步操作能够提升整体程序性能,特别在处理大量任务时尤为重要。

 

posted on 2023-02-16 15:10  白码一号  阅读(47)  评论(0编辑  收藏  举报