返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >.Net中TaskParallelLibrary的进阶用法
  • 323
分享到

.Net中TaskParallelLibrary的进阶用法

.NetTaskParallelLibrary 2022-11-13 18:11:08 323人浏览 独家记忆
摘要

在前一篇中,了解了Task的基本用法 如果一个方法返回Task,Task<T>,如何获取Task的返回值,获取值的过程会阻塞线程吗? static voi

在前一篇中,了解了Task的基本用法

如果一个方法返回Task,Task<T>,如何获取Task的返回值,获取值的过程会阻塞线程吗?

        static void Main(string[] args)
        {
            var result = DoWorkAsync().Result;
            Console.WriteLine(result);
            Console.WriteLine("我会什么时候显示");
            Console.ReadKey();
        }
        static Task<string> DoWorkAsync()
        {
            return Task<string>.Factory.StartNew(() =>
            {
                Thread.Sleep(3000);
                return "hello";
            });
        }

可见,Task的Result属性可以获取返回值,而且,获取返回值的过程线程是被阻塞的。

是否可以不阻塞线程,又能拿到某个线程的返回值呢?ContinueWith方法在某个线程结束之后进行,但同时不会阻塞线程。

        static void Main(string[] args)
        {
            DoWorkAsync().ContinueWith((pre) =>
            {
                Console.WriteLine(pre.Result);
            });
            Console.WriteLine("我会什么时候显示");
            Console.ReadKey();
        }

但ContinueWith总会在某个线程结束之后进行,是否可以对ContinueWith的过程控制一下呢?

        static void Main(string[] args)
        {
            DoWorkAsync().ContinueWith((pre) =>
            {
                Console.WriteLine(pre.Result);
            }, TaskContinuationOptions.NotOnFaulted);
            DoWorkAsync().ContinueWith((pre) =>
            {
                Console.WriteLine(pre.Exception);
            },TaskContinuationOptions.OnlyOnFaulted);
            Console.WriteLine("我会什么时候显示");
            Console.ReadKey();
        }

以上,当没有错误的时候就把返回值显示出来,有错误就把错误信息显示出来。

还可以通过Task的实例方法IsCompleted来判断一个线程是否完成。

        static void Main(string[] args)
        {
            var doWorkTask = DoWorkAsync();
            if (doWorkTask.IsCompleted)
            {
                Console.WriteLine(doWorkTask.Result);
            }
            else
            {
                doWorkTask.ContinueWith((pre) =>
                {
                    Console.WriteLine(pre.Result);
                }, TaskContinuationOptions.NotOnFaulted);
                doWorkTask.ContinueWith((pre) =>
                {
                    Console.WriteLine(pre.Exception);
                }, TaskContinuationOptions.OnlyOnFaulted);
            }
            
            Console.WriteLine("我会什么时候显示");
            Console.ReadKey();
        }

Task的Status属性,以及结合TaskStatus枚举,可以判断Task的状态。

        static void Main(string[] args)
        {
            var HttpClient = new HttpClient();
            Task<string> baiduTask = httpClient.GetStringAsync("http://www.baidu.com");
            var httpClient2 = new HttpClient();
            Task<string> sinaTask = httpClient2.GetStringAsync("http://www.sina.com.cn");
            //等上面2个任务完成时这里再开始
            Task<string[]> task = Task.WhenAll(baiduTask, sinaTask);
            task.ContinueWith(stringArray =>
            {
                //如果任务完成
                if (task.Status == TaskStatus.RanToCompletion)
                {
                    for (int i = 0; i < stringArray.Result.Length;i++)
                    {
                        Console.WriteLine(stringArray.Result[i].Substring(0,100));
                    }
                }
                else if (task.Status == TaskStatus.Canceled) //如果被取消
                {
                    Console.WriteLine("{0}这个任务被取消了",task.Id);
                }
                else //发生错误
                {
                    Console.WriteLine("发生错误了~~");
                    foreach (var item in task.Exception.InnerExceptions)
                    {
                        Console.WriteLine(item.Message);
                    }
                }
            });
            Console.ReadKey();
        }

如果要控制Task的生命周期,可以考虑使用TaskCompletionSource<T>。

       static void Main(string[] args)
        {
            AsyncFactory.GetIntAsync().ContinueWith((prev) =>
            {
                if (prev.Status == TaskStatus.RanToCompletion)
                {
                    Console.WriteLine(prev.Result);
                }
                else if (prev.Status == TaskStatus.Canceled)
                {
                    Console.WriteLine("任务被取消");
                }
                else
                {
                    Console.WriteLine("发生错误哦");
                    Console.WriteLine(prev.Exception);
                }
            });
            Console.ReadKey();
        }
    }
    public static class AsyncFactory
    {
        public static Task<int> GetIntAsync()
        {
            var tsc = new TaskCompletionSource<int>();
            var timer = new System.Timers.Timer(2000);
            timer.AutoReset = false;
            timer.Elapsed += (s, e) =>
            {
                tsc.SetResult(10);
                timer.Dispose();
            };
            timer.Start();
            return tsc.Task;                     
        }
    }

以上,通过TaskCompletionSource<T>的SetResult给线程设置返回值,通过TaskCompletionSource<T>的.Task有获取了线程。

另外,从.net 4.5开始,Task的静态方法FromResult,接收T类型,返回Task<T>。

        static void Main(string[] args)
        {
            var intTask = GetIntAsync();
            if (intTask.Status == TaskStatus.RanToCompletion)
            {
                Console.WriteLine(intTask.Result);
            }
            else if (intTask.Status == TaskStatus.Canceled)
            {
                Console.WriteLine("任务被取消");
            }
            else
            {
                Console.WriteLine("发生错误哦");
                Console.WriteLine(intTask.Exception);
            }
            Console.ReadKey();
        }
        static Task<int> GetIntAsync()
        {
            return Task.FromResult(10);
        }

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对编程网的支持。如果你想了解更多相关内容请查看下面相关链接

--结束END--

本文标题: .Net中TaskParallelLibrary的进阶用法

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

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

猜你喜欢
  • .Net中TaskParallelLibrary的进阶用法
    在前一篇中,了解了Task的基本用法 如果一个方法返回Task,Task<T>,如何获取Task的返回值,获取值的过程会阻塞线程吗? static voi...
    99+
    2022-11-13
    .Net Task Parallel Library
  • .Net中TaskParallelLibrary的基本用法
    我们知道,每个应用程序就是一个进程,一个进程有多个线程。Task Parallel Library为我们的异步编程、多线程编程提供了强有力的支持,它允许一个主线程运行的同时,另外的一...
    99+
    2024-04-02
  • git进阶的用法
    在开发领域,Git是一种强大的版本控制工具。它能够帮助开发者轻松地管理多个代码版本,从而使团队协作更加高效。虽然Git已经成为程序员的常用工具,但是很多人只是使用基础功能而无法发挥Git的全部威力。本文将介绍Git的进阶用法,帮助读者更好地...
    99+
    2023-10-22
  • Android中的Fragment类使用进阶
    0、回顾 Fragment 代表 Activity 当中的一项操作或一部分用户界面。 一个 Activity 中的多个 Fragment 可以组合在一起,形成一个多部分拼接而成...
    99+
    2022-06-06
    fragment Android
  • vue2.x的进阶用法有哪些
    这篇文章主要介绍了vue2.x的进阶用法有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue2.x的进阶用法有哪些文章都会有所收获,下面我们一起来看看吧。一、模板语法条件渲染Vue中的条件渲染通过v-if...
    99+
    2023-07-05
  • node.js中Socket.IO的进阶使用技巧
    在上一篇博文Socket.IO中,我简要介绍了Socket.IO的基本使用方法并创建了一个简单的聊天室DEMO。本篇在入门篇的基础上,继续探讨Socket.IO的进阶用法。本篇将从配置、房间、事件等方面入手...
    99+
    2022-06-04
    进阶 使用技巧 js
  • 深入浅析vue2.x的进阶用法
    Vue是当前最为流行的前端框架之一。它的设计理念优雅、简洁,易于掌握。本文将介绍Vue2.x的进阶用法,涵盖了Vue的模板语法、组件化开发、路由和状态管理等方面。一、模板语法条件渲染Vue中的条件渲染通过v-if、v-else、v-show...
    99+
    2023-05-14
  • pydantic进阶用法示例详解
    目录正文当前现状解决方案总结正文 pydantic是一个Python的数据验证和转换库,它的特点是轻量、快速、可扩展、可配置。笔者常用的用于数据接口schema定义与检查。 具体的...
    99+
    2023-03-15
    pydantic进阶用法 pydantic进阶
  • HTML5进阶FileReader的使用
    FileReader 对象FileReader 对象主要用来把文件读入内存,并且读取文件中的数据。通过构造函数创建一个 FileReader 对象。...
    99+
    2023-06-03
  • 关于Python函数参数的进阶用法
    目录1、关键字参数和位置参数(1)关键字参数(2)位置参数2、接受任意数量的参数(1)接受任意数量的位置参数 (2)接受任意数量的关键字参数(3)同时接受任意数量的位置参数和关键字参...
    99+
    2024-04-02
  • 怎样进行SoapUI的进阶使用
    这期内容当中小编将会给大家带来有关怎样进行SoapUI的进阶使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。关于SoapUI的简单使用,大家可以参考网上并自己摸索下,这里就不说了,下面说的是一些不常见的...
    99+
    2023-06-17
  • .NET中Worker Service的使用方法
    这篇文章主要介绍了.NET中Worker Service的使用方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。请先完成以下准备工作,以便于您理解本文。1、下载并安装最新的 ...
    99+
    2023-06-15
  • NET中ExecuteScalar的用法是什么
    在.NET中,ExecuteScalar是一个方法,用于执行查询并返回结果集中第一行的第一列的值。它通常用于执行返回单个值的查询,比...
    99+
    2023-09-27
    NET
  • .net中HubbleDotNet的用法是什么
    HubbleDotNet是一个在.NET平台上操作Hubble Telescope数据的库。它提供了一组类和方法,用于连接、查询和操...
    99+
    2023-10-25
    .net
  • .NET Core中使用gRPC的方法
    目录1.什么是gRPC1.基本介绍2.proto文件3.上手实践2.gRPC流1.服务端流、客户端流、双向流2.NetCore Web项目作为客户端3.gRPC AOP拦截1.什么是...
    99+
    2024-04-02
  • .NET中preparecommand的用法是什么
    在.NET中,PrepareCommand方法用于准备数据库命令,以便执行查询或更新操作。 PrepareCommand方法的主要用...
    99+
    2023-10-30
    .NET
  • .Net中server.mappath的用法是什么
    在.Net中,Server.MapPath方法用于获取指定虚拟路径的物理路径。 语法: Server.MapPath(path) ...
    99+
    2024-02-29
    .Net
  • Python进阶:切片的误区与高级用法
    2018-12-31 更新声明:切片系列文章本是分三篇写成,现已合并成一篇。合并后,修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔接做了大量改动。原系列的单篇就不删除了,毕竟也是有单独成篇的作用。特此声明,请阅读改...
    99+
    2023-01-30
    进阶 切片 误区
  • python进阶用法3 【优化毫不起眼的
    这篇博客提及三个关于python循环的优化细节,如有其他一些优化的方案,欢迎留言分享~QWQ 在谈这个环节之前,我们先回顾一波何为生成器及何为yield 要理解yiled还需要理解生成器,而要理解生成器,首先需要理解迭代器。...
    99+
    2023-01-31
    进阶 python
  • vuex新手进阶篇之actions的使用方法
    目录1.设置actions事件2.在组件中去分发actions3.注意点actions的细节补充总结紧接上篇文章,本篇文章讲vuex ,如何去改变state ,actions的使用,...
    99+
    2022-11-13
    vuex actions使用 vuex设置actions
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作