异步编程学习总结3

Task.WhenAll、Task.WhenAny用法:

1.Task.WhenAll,所有Task完成,Task才完成,用于等待多个任务执行结束,但是不在乎它们的执行顺序。

2.Task.WhenAny,任何一个Task完成,Task就完成。

准备一个文件夹TEMP,里面新建两个文本文件,并在文件中写入一些内容

其中1.txt中的文本长度为11,2.txt中文本内容长度为10

代码示例:获取文件夹中所有文件内容字符长度之和(Task.WhenAll)

        static async Task Main(string[] args)
        {
            string[] files = Directory.GetFiles(@"C:\TEMP");
            Task<int>[] countTasks = new Task<int>[files.Length];
            for (int i = 0; i < files.Length; i++)
            {
                string filename = files[i];
                Task<int> t = ReadCharsCount(filename);
                countTasks[i] = t;
            }
            int[] counts = await Task.WhenAll(countTasks);//Task<TResult[]>
            int c = counts.Sum();
            Console.WriteLine(c);
        }


        /// <summary>
        /// 获取文件中字符个数
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        static async Task<int> ReadCharsCount(string filename)
        {
            string s = await File.ReadAllTextAsync(filename);
            return s.Length;
        }

执行结果:

代码示例:获取文件夹中任一文件内容字符长度(Task.WhenAny)

        static async Task Main(string[] args)
        {
            string[] files = Directory.GetFiles(@"C:\TEMP");
            Task<int>[] countTasks = new Task<int>[files.Length];
            for (int i = 0; i < files.Length; i++)
            {
                string filename = files[i];
                Task<int> t = ReadCharsCount(filename);
                countTasks[i] = t;
            }
            Task<int> counts = await Task.WhenAny(countTasks);//Task<Task<TResult>>
            Console.WriteLine(counts.Result);
        }


        /// <summary>
        /// 获取文件中字符个数
        /// </summary>
        /// <param name="filename"></param>
        /// <returns></returns>
        static async Task<int> ReadCharsCount(string filename)
        {
            string s = await File.ReadAllTextAsync(filename);
            return s.Length;
        }

执行结果:

 获取到了1.txt中的字符串长度。

Task.WhenAll、Task.WhenAny都有多个重载方法,可以根据实际需要情况调用不同的重载方法。

猜你喜欢

转载自blog.csdn.net/liangmengbk/article/details/121218238