C#中的Task.WhenAll和Task.WhenAny方法介绍

 更新时间:2022年04月21日 09:20:29   作者:農碼一生  
这篇文章介绍了C#中的Task.WhenAll和Task.WhenAny方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、简介

Task.WhenAll()、Task.WhenAny()这两个与Task.WaitALL()、Task.WaitAny()是有区别的,When是异步的,Wait是同步的。
Task.WhenAll():所有提供的任务已完成时,创建将完成的任务。
Task.WhenAny():任何提供的任务已完成时,创建将完成的任务。

二、代码案例

Task.WhenAll

代码:

    class Program
    {
        public class DownLoadTest
        {
            Stopwatch watch = new Stopwatch();
            public DownLoadTest()
            {
                watch.Start();
            }
            public string DownLoadString(string url)
            {
                Console.WriteLine(string.Format("下載{0}開始運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                WebClient wc = new WebClient();
                string str = wc.DownloadString(url);
                Console.WriteLine(string.Format("下載{0}運行結束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                return str;
            }

            public async Task<string> DoRunStringAsync(string url)
            {
                Console.WriteLine(string.Format("異步程序獲取{0}開始運行:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                var task = await DownLoadStringAsync(url);
                Console.WriteLine(string.Format("異步程序獲取{0運行結束:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                return task;
            }

            public async Task<string> DownLoadStringAsync(string url)
            {
                string str = await Task.Run(() => DownLoadString(url));
                return str;
            }
        }

        static void Main(string[] args)
        {
            string[] urls = { "https://www.baidu.com/", "https://www.taobao.com/", "https://www.cnblogs.com/" };
            var task = DoRunsAsync(urls);
            //task.Wait(3000);
            Console.WriteLine(string.Format("主線程運行結束."));
            Console.ReadKey();
        }

        private static async Task<string> DoRunsAsync(IEnumerable<string> urls)
        {
            DownLoadTest dwtest = new DownLoadTest();
            List<Task> tasks = new List<Task>();
            foreach (var url in urls)
            {
                var task = dwtest.DoRunStringAsync(url);
                Console.WriteLine("task.Id =" + task.Id + "  url=" + url);
                tasks.Add(task);
            }
            await Task.WhenAll(tasks);
            foreach (var task in tasks)
            {
                Console.WriteLine("task.Id =" + task.Id + "  task.Status=" + task.Status);
            }
            return "";
        }
    }

运行结果:

可以看到await Task.WhenAll(tasks);异步等待了所有的任务完成。

Task.WhenAny

代码:

    class Program
    {
        public class DownLoadTest
        {
            Stopwatch watch = new Stopwatch();
            public DownLoadTest()
            {
                watch.Start();
            }
            public string DownLoadString(string url)
            {
                Console.WriteLine(string.Format("下載{0}開始運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                WebClient wc = new WebClient();
                string str = wc.DownloadString(url);
                Console.WriteLine(string.Format("下載{0}運行結束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                return str;
            }

            public async Task<string> DoRunStringAsync(string url)
            {
                Console.WriteLine(string.Format("異步程序獲取{0}開始運行:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                var task = await DownLoadStringAsync(url);
                Console.WriteLine(string.Format("異步程序獲取{0運行結束:{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds));
                return task;
            }

            public async Task<string> DownLoadStringAsync(string url)
            {
                string str = await Task.Run(() => DownLoadString(url));
                return str;
            }
        }

        static void Main(string[] args)
        {
            string[] urls = { "https://www.baidu.com/", "https://www.taobao.com/", "https://www.cnblogs.com/" };
            var task = DoRunsAsync(urls);
            task.Wait(1000);
            Console.WriteLine(string.Format("主線程運行結束."));
            Console.ReadKey();
        }

        private static async Task<string> DoRunsAsync(IEnumerable<string> urls)
        {
            DownLoadTest dwtest = new DownLoadTest();
            List<Task> tasks = new List<Task>();
            foreach (var url in urls)
            {
                var task = dwtest.DoRunStringAsync(url);
                Console.WriteLine("task.Id =" + task.Id + "  url=" + url);
                tasks.Add(task);
            }
            await Task.WhenAny(tasks);
            foreach (var task in tasks)
            {
                Console.WriteLine("task.Id =" + task.Id + "  task.Status=" + task.Status);
            }
            return "";
        }
    }

运行结果:

Task.WhenAny(tasks)至少等待了一个任务的完成。这里https://www.baidu.com/先下载完,就直接终止等待 。

到此这篇关于C#中Task.WhenAll和Task.WhenAny方法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#基础知识之字符串和正则表达式

    C#基础知识之字符串和正则表达式

    目前为止许多编程语言和工具都包含对正则表达式的支持,C#也不例外,下面这篇文章主要给大家介绍了关于C#基础知识之字符串和正则表达式的相关资料,需要的朋友可以参考下
    2022-10-10
  • C#实现多线程的同步方法实例分析

    C#实现多线程的同步方法实例分析

    这篇文章主要介绍了C#实现多线程的同步方法,实例分析了C#线程同步的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 基于C#实现屏幕取色器的示例详解

    基于C#实现屏幕取色器的示例详解

    这篇文章主要为大家详细介绍了如何利用C#实现屏幕取色器,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • 用C#生成不重复的随机数的代码

    用C#生成不重复的随机数的代码

    我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.net Framework中提供了一个专门用来产生随机数的类System.Random
    2013-02-02
  • Unity实现颜色渐变滑动条

    Unity实现颜色渐变滑动条

    这篇文章主要为大家详细介绍了Unity实现颜色渐变滑动条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • C#如何使用Bogus创建模拟数据示例代码

    C#如何使用Bogus创建模拟数据示例代码

    这篇文章主要给大家介绍了关于C#如何使用Bogus创建模拟数据的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • C#中通过反射将枚举元素加载到ComboBo的实现方法

    C#中通过反射将枚举元素加载到ComboBo的实现方法

    本文主要介绍了C#中通过反射将枚举元素加载到ComboBo的实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • C#传值方式实现不同程序窗体间通信实例

    C#传值方式实现不同程序窗体间通信实例

    Form2构造函数中接收一个string类型参数,即Form1中选中行的文本,将Form2的TextBox控件的Text设置为该string,即完成了Form1向Form2的传值
    2013-12-12
  • C#使用oledb导出数据到excel的方法

    C#使用oledb导出数据到excel的方法

    这篇文章主要介绍了C#使用oledb导出数据到excel的方法,结合实例形式分析了C#操作oledb导出数据的相关技巧与注意事项,需要的朋友可以参考下
    2016-06-06
  • C#实现将商品金额小写转换成大写的方法

    C#实现将商品金额小写转换成大写的方法

    这篇文章主要介绍了C#实现将商品金额小写转换成大写的方法,涉及C#数组与字符串的相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-08-08

最新评论