广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#中的Task.WhenAll和Task.WhenAny方法介绍
  • 659
分享到

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

2024-04-02 19:04:59 659人浏览 八月长安
摘要

一、简介 Task.WhenAll()、Task.WhenAny()这两个与Task.WaitALL()、Task.WaitAny()是有区别的,When是异步的,Wait是同步的。

一、简介

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方法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#中的Task.WhenAll和Task.WhenAny方法介绍

本文链接: https://www.lsjlt.com/news/146726.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中的Task.WhenAll和Task.WhenAny方法介绍
    一、简介 Task.WhenAll()、Task.WhenAny()这两个与Task.WaitALL()、Task.WaitAny()是有区别的,When是异步的,Wait是同步的。...
    99+
    2022-11-13
  • C#中的Task.WhenAll和Task.WhenAny方法怎么用
    本篇内容介绍了“C#中的Task.WhenAll和Task.WhenAny方法怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、简介T...
    99+
    2023-06-30
  • C#中的Task.WaitAll和Task.WaitAny方法介绍
    一、简介 Task.WaitAll:等待所有提供的 Task 对象完成执行过程。 Task.WaitAny:等待提供的任一 Task 对象完成执行过程。 二、代码案例 Task.Wa...
    99+
    2022-11-13
  • C#中Dispose和Finalize方法使用介绍
    一、前言 在C#中,由于有了垃圾回收机制的支持,对象的析构和以前的C++有了很大的不同,这就要求程序员在设计类型的时候,充分理解.NET的机制,明确怎样利用Dispose方法和Fin...
    99+
    2022-11-13
  • C#调用WebService的方法介绍
    一、前言 在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中如何调用WebService。首先我们创...
    99+
    2022-11-13
  • C#委托方法Func()中GetInvocationList()方法的用法介绍
    在日常使用委托时,有以下常用方法 方法名称说明 Clone  创建委托的浅表副本。 GetInvocationList  按照调用顺序返回此多...
    99+
    2022-11-12
  • C#操作进程的方法介绍
    进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行...
    99+
    2022-11-13
  • C#接口方法的实例介绍
    本篇内容介绍了“C#接口方法的实例介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!公有方法实现C#接口方法尽管C#在定义接口时不用指明接口...
    99+
    2023-06-18
  • C++堆栈的使用方法介绍
    本篇内容介绍了“C++堆栈的使用方法介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在开发这个大的领域,C++堆栈是一个不容忽视的概念,但...
    99+
    2023-06-17
  • C++中declspec(dllexport)和declspec(dllimport) 的用法介绍
    一、创建动态文件 1.添加头文件dll.h,并输入以下代码: #ifdef DLL_EXPORTS //如果在工程里已经添加预定义宏DL...
    99+
    2022-11-13
  • C# 列表List的常用属性和方法介绍
    1.创建列表 (列表可以存储任何类型的数据,在创建列表对象的时候首先要指定你要创建的这个列表要存储什么类型的)(泛型) //创建列表 //方法一 ...
    99+
    2022-11-12
  • C#中匿名方法与委托的关系介绍
    当对2个数实现加减乘除,其中的一个解决方案是通过委托来实现。如下: class Program { private delegate int Cacu...
    99+
    2022-11-13
  • C#中委托的基础介绍与实现方法
    这篇文章主要讲解了“C#中委托的基础介绍与实现方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中委托的基础介绍与实现方法”吧!目录前言关于委托委托的实现一、基本实现方式二、使用委托时的...
    99+
    2023-06-20
  • C++中strtok()函数的用法介绍
    函数原型:char *strtok(char *s, const char *delim);Function:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。D...
    99+
    2022-11-15
    strtok C++
  • C语言中.与->的用法介绍
    目录(一)基础(二)例子(三)总结(一)基础 结构体用点,结构体指针用箭头。 a->b 的含义是 (*a).b 。  现代的标...
    99+
    2023-05-20
    C语言中.与->的区别 C语言->用法
  • C#实现加密的几种方法介绍
    1.ACSII码加密 //ACSII码加密 private static string ACSIIPWd(string rpwd) { ...
    99+
    2022-11-13
  • javaArrayList中的remove方法介绍
    先看一段代码,看看自定义的ArrayList中的remove设计是否有问题。 public class MyArrayList { private Object[] mDat...
    99+
    2022-11-12
  • Android 中LayoutInflater.inflate()方法的介绍
    Android 中LayoutInflater.inflate()方法的介绍最近一直想弄明白LayoutInflater对象的inflate方法的用法,今天做了实例。<LinearLayout android:id="@+id...
    99+
    2023-05-30
    android layoutinflater flat
  • DataTable的AcceptChanges()和RejectChanges()方法介绍
    AcceptChanges()方法是DataTable类的一个方法,用于将对DataTable所做的所有更改应用到当前数据行。这意味...
    99+
    2023-08-09
    DataTable
  • C语言rand和srand函数使用方法介绍
    目录前言随机数的本质重新播种生成一定范围内的随机数连续生成随机数前言 在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌。 在C语言中...
    99+
    2023-02-11
    C语言rand和srand C语言rand方法 C语言srand方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作