C#异步编程Task怎么创建
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要介绍"C#异步编程Task怎么创建",在日常操作中,相信很多人在C#异步编程Task怎么创建问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C#异步编程Tas
千家信息网最后更新 2025年01月20日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); } }
结果:
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(); } }
结果:
带返回值方式
线程引用方法
static TaskCreateTask(string name) { return new Task (() => 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; }
方式四:
//方式四 Tasktask = CreateTask("Task_1"); task.Start(); int result = task.Result;
实例:
class Program { static TaskCreateTask(string name) { return new Task (() => TaskMethod(name)); } static void Main(string[] args) { TaskMethod("Main Thread Task"); Task 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 getsumtask = new Task (() => 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; } }
结果:
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 TaskAsyncGetsum() { await Task.Delay(1); int sum = 0; Console.WriteLine("使用Task執行異步操作."); for (int i = 0; i < 100; i++) { sum += i; } return sum; } }
结果:
到此,关于"C#异步编程Task怎么创建"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
任务
方式
线程
结果
C#
编程
方法
学习
支持
更多
运行
功能
实例
常规
状态
过程
队列
工作
帮助
实用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
0基础软件开发市场前景如何
网络安全的影响因素和防范措施
云南运营网络技术服务代理商
里程碑 软件开发
中国肿瘤数据库
如何用管理器建立数据库
教育学应该看什么外文数据库
简述网络安全的概率
网络安全和信息化测评
自媒体数据库需求分析
当下软件开发的主流技术
重庆维普期刊数据库论文查询
员工网络安全责任书
tbc部落哪个服务器g团多
30万产品数据库
涉密网络安全技术防护措施
正规软件开发定做
数据库表为什么主键自增
软件开发公司招人骗局
现代网络技术怎么用
通州区网络技术概况
网络安全的应用技术
在access数据库中表就是什
华为云平台搭建数据库
旋律互联网科技
网络安全职责
文件服务器可以放同名的文件吗
微网互联网络科技有限公司
微信小程序数据库插入数据
软件开发mr周期