返回顶部
首页 > 资讯 > 精选 >怎么在C#中利用Task执行异步
  • 616
分享到

怎么在C#中利用Task执行异步

2023-06-14 23:06:15 616人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关怎么在C#中利用Task执行异步,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么要使用 Task线程是创建并发的底层工具,因此具有一定的局限性。没有简单的方法

这篇文章将为大家详细讲解有关怎么在C#中利用Task执行异步,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

为什么要使用 Task

线程是创建并发的底层工具,因此具有一定的局限性。

  • 没有简单的方法可以从联合(Join)线程得到“返回值”。因此必须创建一些共享域。当抛出一个异常时,捕捉和处理异常也是麻烦的。

  • 线程完成之后,无法再次启动该线程。相反,只能联合(Join)它(在进程阻塞当前线程)。

任务是可组合的——使用延续将它们串联在一起。它们可以使用线程池减少启动延迟,而且它们可以通过TaskCompletionSource使用回调方法,避免多个线程同时等待I/O密集操作。

Task 和 Thread 区别

任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。

任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。

Task和Thread一样,位于System.Threading命名空间下

与线程相比,Task是一个更高级的抽象概念,它标识一个通过或不通过线程实现的并发操作。

Task 介绍

Task 类的表示单个操作不返回一个值,通常以异步方式执行。 Task 对象是一个的中心思想 基于任务的异步模式 首次引入.net Framework 4 中。 因为由执行工作 Task 对象通常以异步方式执行在线程池线程上而不是以同步方式在主应用程序线程,您可以使用 Status 属性,以及 IsCanceled, ,IsCompleted, ,和 IsFaulted 属性,以确定任务的状态。 大多数情况下,lambda 表达式用于指定的任务是执行的工作。

Task 简单实现

通过使用Task的构造函数来创建任务,并调用Start方法来启动任务并执行异步操作。

static void Main(string[] args){        Console.WriteLine("主线程执行业务处理.");        //创建任务        Task task = new Task(() => {            Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");            for (int i = 0; i < 10; i++)            {                  Console.WriteLine(i);            }      });     //启动任务,并安排到当前任务队列线程中执行任务      task.Start();      Console.WriteLine("主线程执行其他处理");}

从Framework 4.5开始,启动一个由后台线程实现的Task,也可以使用静态方法 Task.Run

Task task = Task.Run(() =>    {        Thread.Sleep(2000);        Console.WriteLine("Foo");    });

Task默认使用线程池,它们都是后台线程。意味当主线程结束时,所有任务都会随之停止。

Task 执行状态

1.等待(Wait)

调用Wait方法,可以阻塞任务,直至任务完成,效果等同于Thread.Join:

Task task = Task.Run(() =>    {        Thread.Sleep(2000);        Console.WriteLine("Foo");    });    Console.WriteLine(task.IsCompleted); //False    task.Wait();//阻塞,直至任务完成    Console.WriteLine(task.IsCompleted); //True    Console.ReadLine();

2. 返回值

Task<TResult>允许任务返回一个值。调用Task.Run,传入一个Func<TResult>代理(或者兼容的Lambda表达式),代替Action,就可以获得一个Task<TResult>:

Task<int> task = Task.Run (() => { Console.WriteLine ("Foo"); return 3; });int result = task.Result;      // Blocks if not already finishedConsole.WriteLine (result);    // 3

下面的例子创建一个任务,它使用LINQ就按前3百万个整数(从2开始)中的素数个数:

Task<int> primeNumberTask = Task.Run(() =>        Enumerable.Range(2, 3000000).Count(n => Enumerable.Range(2, (int)Math.Sqrt(n) - 1).All(i => n % i > 0)));    Console.WriteLine("Task running...");    Console.WriteLine("The answer is " + primeNumberTask.Result);

这段代码会打印“Task running...”,然后几秒钟后打印216815。

3. Task.Delay

Task.Delay是Thread.Sleep的异步版本

Task.Delay(5000).GetAwaiter().OnCompleted(()=>Console.WriteLine(42));

或者

Task.Delay(5000).ContinueWith(ant => Console.WriteLine(42));

关于怎么在C#中利用Task执行异步就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在C#中利用Task执行异步

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

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

猜你喜欢
  • 怎么在C#中利用Task执行异步
    这篇文章将为大家详细讲解有关怎么在C#中利用Task执行异步,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么要使用 Task线程是创建并发的底层工具,因此具有一定的局限性。没有简单的方法...
    99+
    2023-06-14
  • C#如何使用Task执行异步操作
    目录为什么要使用 Task Task 和 Thread 区别 Task 介绍 Task 简单实现 Task 执行状态 1.等待(Wait) 2. 返回值 3. Task.Delay ...
    99+
    2024-04-02
  • Task怎么提高异步执行效率
    本篇内容介绍了“Task怎么提高异步执行效率”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!async Task 语法糖出来后,异步编程变得非...
    99+
    2023-06-29
  • C#怎么Task执行任务
    本篇内容介绍了“C#怎么Task执行任务”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Task执行任务,等待任务完成代码://任务Func&...
    99+
    2023-07-02
  • C#异步编程Task怎么创建
    这篇文章主要介绍“C#异步编程Task怎么创建”,在日常操作中,相信很多人在C#异步编程Task怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#异步编程Task怎么创建”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • C#怎么使用Task实现执行并行任务
    这篇“C#怎么使用Task实现执行并行任务”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#怎么使用Task实现执行并行任务...
    99+
    2023-07-05
  • shell脚本怎么异步并行执行
    在shell脚本中,可以使用以下几种方式来实现异步并行执行:1. 后台执行:在命令后面加上`&`,可以将命令放到后台执行。例如:``...
    99+
    2023-09-22
    shell
  • C#中怎么利用Socket实现异步通讯
    这篇文章将为大家详细讲解有关C#中怎么利用Socket实现异步通讯,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C# Socket异步通讯客户端之主程序:using System;using...
    99+
    2023-06-17
  • C#中怎么利用AsyncResult实现异步编程
    这篇文章给大家介绍C#中怎么利用AsyncResult实现异步编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#异步编程模式IAsyncResult概述IAsyncResult 异步设计模式通过名为 BeginOp...
    99+
    2023-06-17
  • C#中怎么利用委托实现异步调用
    这篇文章将为大家详细讲解有关C#中怎么利用委托实现异步调用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。委托实现C#异步调用的步骤:定义委托。将要进行异步调用的方法“实例化”到定义的委托。在...
    99+
    2023-06-17
  • 怎么在python中利用asyncio实现异步IO
    这篇文章给大家介绍怎么在python中利用asyncio实现异步IO,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌...
    99+
    2023-06-14
  • PHP无法异步执行怎么解决
    本文小编为大家详细介绍“PHP无法异步执行怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP无法异步执行怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是异步执行?在传统的同步编程中,代码在...
    99+
    2023-07-05
  • Springboot利用Aop捕捉注解实现业务异步执行
    目录一、先说说线程的几种创建方式(简要列举)二、再聊一聊spring自带的@Async注解实现异步任务的方法三、那么就来设计一下怎么使用自定义的注解实现异步任务在开发过程中,尽量会将...
    99+
    2023-05-14
    Springboot业务异步执行 Springboot Aop捕捉注解
  • C#中异步方法返回的void和Task有什么区别
    C#中异步方法返回的void和Task有什么区别?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#异步方法返回void和Task的区别如果异步(async关键字...
    99+
    2023-06-06
  • java异步线程不执行怎么解决
    如果Java异步线程不执行,可以尝试以下几种解决方法:1. 检查线程是否正确创建和启动:确保创建了一个Thread对象并调用了sta...
    99+
    2023-08-31
    java
  • 怎么在python中利用exec()函数执行表达式
    本篇文章为大家展示了怎么在python中利用exec()函数执行表达式,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python主要应用领域有哪些1、云计算,典型应用OpenStack。2、WEB前...
    99+
    2023-06-14
  • C#多线程异步执行和跨线程访问控件Helper怎么用
    本文小编为大家详细介绍“C#多线程异步执行和跨线程访问控件Helper怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#多线程异步执行和跨线程访问控件Helper怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-06-30
  • c语言在linux中怎么编译执行
    在 linux 中编译和执行 c 程序的步骤如下:使用文本编辑器创建包含 c 代码的源文件。使用 gcc 编译源文件生成目标文件,命令为:gcc -o 。运行目标文件,命令为:./。 ...
    99+
    2024-04-05
    linux c语言
  • C#中怎么利用异步实现一个进度条效果
    本篇文章给大家分享的是有关C#中怎么利用异步实现一个进度条效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#进度条实现之异步实例进度条页面://==============...
    99+
    2023-06-17
  • 怎么在java中利用多线程执行多个程序
    这期内容当中小编将会给大家带来有关怎么在java中利用多线程执行多个程序,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作