返回顶部
首页 > 资讯 > 精选 >C#异步编程Task怎么创建
  • 488
分享到

C#异步编程Task怎么创建

2023-06-30 07:06:22 488人浏览 安东尼
摘要

这篇文章主要介绍“C#异步编程Task怎么创建”,在日常操作中,相信很多人在C#异步编程Task怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#异步编程Task怎么创建”的疑惑有所帮助!接下来,请跟

这篇文章主要介绍“C#异步编程Task怎么创建”,在日常操作中,相信很多人在C#异步编程Task怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#异步编程Task怎么创建”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、简介

ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
Task支持线程的取消、完成、失败通知等交互性操作,但是ThreadPool不支持;
Task支持线程执行的先后次序,但是ThreadPool不支持;;
以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的api。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。

            Task t = new Task(() =>            {                Console.WriteLine("Start……");                //模拟工作过程                Thread.Sleep(5000);            });            t.Start();            t.ContinueWith((task) =>            {                Console.WriteLine("Already Finished,States:");                Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}", task.IsCanceled, task.IsCompleted, task.IsFaulted);            });            Console.ReadKey();

二、Task创建

无返回值创建方式

线程引用方法:

        static void TaskMethod(string name)        {            Console.WriteLine("Task: {0} is running on a thread id {1}. Is thread pool thread: {2}",                name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);        }
方式一:
            //方式一            var t1 = new Task(() => TaskMethod("Task_1"));            t1.Start();            //等待所有任务结束             //任务的状态:            //Start之前为:Created            //Start之后为:WaitingToRun            Task.WaitAll(t1);////等待所有任务结束
方式二:
            //方式二            Task.Run(() => TaskMethod("Task_2"));
方式三:
            //方式三            Task.Factory.StartNew(() => TaskMethod("Task_3")); //直接异步的方法             //或者            var t3 = Task.Factory.StartNew(() => TaskMethod("Task_3"));            Task.WaitAll(t3);//等待所有任务结束             //任务的状态            //Start之前为:Running                   //Start之后为:Running

实例:

    class Program    {        static void Main(string[] args)        {            var t1 = new Task(() => TaskMethod("Task_1"));            var t2 = new Task(() => TaskMethod("Task_2"));            t2.Start();            t1.Start();            Task.WaitAll(t1, t2);            Task.Run(() => TaskMethod("Task_3"));            Task.Factory.StartNew(() => TaskMethod("Task_4"));            //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行。            Task.Factory.StartNew(() => TaskMethod("Task_5"), TaskCreationOptions.LongRunning);            #region 常规的使用方式            Console.WriteLine("主線程執行業務處理.");            //创建任务            Task task = new Task(() =>            {                Console.WriteLine("使用System.Threading.Tasks.Task執行異步操作.");                for (int i = 0; i < 10; i++)                {                    Console.WriteLine(i);                }            });            //启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)            task.Start();            Console.WriteLine("主線程執行其他處理");            task.Wait();            #endregion            Thread.Sleep(TimeSpan.FromSeconds(1));            Console.ReadLine();        }        static void TaskMethod(string name)        {            Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}",                name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);        }    }

结果:

C#异步编程Task怎么创建

async/await的实现方式:
    class Program    {        async static void AsyncFunction()        {            await Task.Delay(1);            Console.WriteLine("使用System.Threading.Tasks.Task執行異步操作.");            for (int i = 0; i < 10; i++)            {                Console.WriteLine(string.FORMat("AsyncFunction:i={0}", i));            }        }        public static void Main()        {            Console.WriteLine("主線程執行業務處理.");            AsyncFunction();            Console.WriteLine("主線程執行其他處理");            for (int i = 0; i < 10; i++)            {                Console.WriteLine(string.Format("Main:i={0}", i));            }            Console.ReadLine();        }    }

结果:

C#异步编程Task怎么创建

带返回值方式

线程引用方法
        static Task<int> CreateTask(string name)        {            return new Task<int>(() => TaskMethod1(name));        }
        static int TaskMethod1(string name)        {            Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}",                name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);            Thread.Sleep(TimeSpan.FromSeconds(2));            return 42;        }
方式四:
            //方式四            Task<int> task = CreateTask("Task_1");            task.Start();            int result = task.Result;

实例:

    class Program    {        static Task<int> CreateTask(string name)        {            return new Task<int>(() => TaskMethod(name));        }        static void Main(string[] args)        {            TaskMethod("Main Thread Task");            Task<int> task = CreateTask("Task_1");            task.Start();            int result = task.Result;            Console.WriteLine("Task_1 Result is: {0}", result);            task = CreateTask("Task_2");            //该任务会运行在主线程中            task.RunSynchronously();            result = task.Result;            Console.WriteLine("Task_2 Result is: {0}", result);            task = CreateTask("Task_3");            Console.WriteLine(task.Status);            task.Start();            while (!task.IsCompleted)            {                Console.WriteLine(task.Status);                Thread.Sleep(TimeSpan.FromSeconds(0.5));            }            Console.WriteLine(task.Status);            result = task.Result;            Console.WriteLine("Task_3 Result is: {0}", result);            #region 常规使用方式            //创建任务            Task<int> getsumtask = new Task<int>(() => Getsum());            //启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)            getsumtask.Start();            Console.WriteLine("主線程執行其他處理");            //等待任务的完成执行过程。            getsumtask.Wait();            //获得任务的执行结果            Console.WriteLine("任務執行結果:{0}", getsumtask.Result.ToString());            Console.ReadLine();            #endregion        }        static int TaskMethod(string name)        {            Console.WriteLine("Task: {0} is running on a thread id {1}. Is thread pool thread: {2}",                name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);            Thread.Sleep(TimeSpan.FromSeconds(2));            return 42;        }        static int Getsum()        {            int sum = 0;            Console.WriteLine("使用Task執行異步操作.");            for (int i = 0; i < 100; i++)            {                sum += i;            }            return sum;        }    }

结果:

C#异步编程Task怎么创建

async/await的实现:
    class Program    {        public static void Main()        {            var ret1 = AsyncGetsum();            Console.WriteLine("主線程執行其他處理");            for (int i = 1; i <= 3; i++)                Console.WriteLine("Call Main()");            int result = ret1.Result;                  //阻塞主线程            Console.WriteLine("任務執行結果:{0}", result);            Console.ReadLine();        }        async static Task<int> AsyncGetsum()        {            await Task.Delay(1);            int sum = 0;            Console.WriteLine("使用Task執行異步操作.");            for (int i = 0; i < 100; i++)            {                sum += i;            }            return sum;        }    }

结果:

C#异步编程Task怎么创建

到此,关于“C#异步编程Task怎么创建”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C#异步编程Task怎么创建

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

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

猜你喜欢
  • C#异步编程Task怎么创建
    这篇文章主要介绍“C#异步编程Task怎么创建”,在日常操作中,相信很多人在C#异步编程Task怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#异步编程Task怎么创建”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-30
  • C#异步编程Task的创建方式
    一、简介 ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:Task支持线程的取消、完成、失败通知等交互性操作,但是T...
    99+
    2024-04-02
  • asyncio异步编程中Task对象是什么
    小编给大家分享一下asyncio异步编程中Task对象是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.Task对象的作用可以将多个任务添加到事件循环当中,...
    99+
    2023-06-29
  • asyncio异步编程之Task对象详解
    目录1.Task对象的作用2.如何创建task对象3.示例一(目前不推荐这种写法)4.示例25.示例3(算是以上示例2的简化版)总结1.Task对象的作用 可以将多个任务添加到事件循...
    99+
    2024-04-02
  • 怎么在C#中利用Task执行异步
    这篇文章将为大家详细讲解有关怎么在C#中利用Task执行异步,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。为什么要使用 Task线程是创建并发的底层工具,因此具有一定的局限性。没有简单的方法...
    99+
    2023-06-14
  • C#并行编程之Task同步机制
    目录一、隔离执行:不共享数据,让每个task都有一份自己的数据拷贝。1、传统方式2、ThreadLocal类二、同步类型:通过调整task的执行,有序的执行task。1、Lock锁2...
    99+
    2024-04-02
  • c# 异步编程入门
    目录一、什么算异步? 二、在编程中的异步 三、原始的异步编程模式之回调函数# 1、回调函数 一、什么算异步?   广义来讲,两个工作流能同时进行就算异步,例...
    99+
    2024-04-02
  • C#中怎么实现异步网络编程
    这期内容当中小编将会给大家带来有关C#中怎么实现异步网络编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#异步网络编程两大方法一、Asynchronous Sockets的方法Socket类的很多连接...
    99+
    2023-06-17
  • C#异步编程之async/await怎么使用
    今天小编给大家分享一下C#异步编程之async/await怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。概述异步这个...
    99+
    2023-07-05
  • C#并发编程之Task类怎么使用
    这篇文章主要介绍了C#并发编程之Task类怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#并发编程之Task类怎么使用文章都会有所收获,下面我们一起来看看吧。Task.RunTask是建立在线程池之上...
    99+
    2023-07-05
  • Task怎么提高异步执行效率
    本篇内容介绍了“Task怎么提高异步执行效率”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!async Task 语法糖出来后,异步编程变得非...
    99+
    2023-06-29
  • C#中怎么利用AsyncResult实现异步编程
    这篇文章给大家介绍C#中怎么利用AsyncResult实现异步编程,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C#异步编程模式IAsyncResult概述IAsyncResult 异步设计模式通过名为 BeginOp...
    99+
    2023-06-17
  • c# 异步编程基础讲解
    目录Task 和 Task<T>I/O 受限异步操作CPU 受限异步操作异步编程模式现代应用程序广泛使用文件和网络 I/O。I/O 相关 API 传统上默认是阻塞的,导致...
    99+
    2024-04-02
  • Java中的异步与线程池怎么创建使用
    这篇文章主要介绍“Java中的异步与线程池怎么创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java中的异步与线程池怎么创建使用”文章能帮助大家解决问题。初始化线程的4种方式1.继承Thre...
    99+
    2023-07-04
  • C#怎么使用async和await实现异步编程
    这篇文章主要介绍“C#怎么使用async和await实现异步编程”,在日常操作中,相信很多人在C#怎么使用async和await实现异步编程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么使用async...
    99+
    2023-07-02
  • c#怎么创建线程
    c# 中创建线程的方法包括:使用 thread 类:创建 thread 对象并调用 start() 方法启动线程。使用 task 类:创建 task 对象并调用 start() 方法启动...
    99+
    2024-05-14
    c#
  • 怎么理解异步编程RxJava
    这篇文章给大家介绍怎么理解异步编程RxJava,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言前段时间写了一篇对协程的一些理解,里面提到了不管是协程还是callback,本质上其实提供的是一种异步无阻塞的编程模式;并...
    99+
    2023-06-17
  • C#中的异步编程模式是什么
    在C#中,异步编程模式是通过async和await关键字来实现的。使用这种方式可以将耗时的操作(例如网络请求、文件操作等)放在一个单...
    99+
    2024-04-03
    C#
  • C#异步编程由浅入深(一)
    目录一、什么算异步?二、在编程中的异步三、原始的异步编程模式之回调函数1、回调函数一、什么算异步? 广义来讲,两个工作流能同时进行就算异步,例如,CPU与外设之间的工作流就是异步的。...
    99+
    2024-04-02
  • C#异步编程的三种模式
    使用异步编程,方法调用是在后台运行(通常在线程和任务的帮助下),并且不会阻塞调用线程。异步编程有三种模式:异步模式,基于事件的异步模式和基于任务的异步模式(TAP)。 一.异步模式 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作