千家信息网

C#连续任务Task.ContinueWith方法怎么用

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇"C#连续任务Task.ContinueWith方法怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,
千家信息网最后更新 2026年11月01日C#连续任务Task.ContinueWith方法怎么用

这篇"C#连续任务Task.ContinueWith方法怎么用"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C#连续任务Task.ContinueWith方法怎么用"文章吧。

一、简介

通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务。ContinueWith是Task根据其自身状况,决定后续应该作何操作。也就是说,在运行完task后,会执行task.continuewith(XX)中的XX语句,但是是否执行、如何执行等需要看task的运行情况。例如:一个使用前一个任务的结果的新任务,如果前一个任务失败了,这个任务就应执行一些清理工作。任务处理程序都不带参数或者带一个对象参数,而任务的连续处理方法都有一个Task类型的参数。

二、案例

案例一:

代码:

        static int TaskMethod(string name, int seconds)        {            Console.WriteLine("Frist Task Method : 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(seconds));            return 60 * seconds;        }        static void Main(string[] args)        {            var FirstTask = new Task(() => TaskMethod("Frist Task", 3));            FirstTask.ContinueWith(t => Console.WriteLine("Frist Task Result: {0}. Thread id: {1}, Is in Thred Pool: {2}",            t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread),            TaskContinuationOptions.OnlyOnRanToCompletion);//線程池線程            FirstTask.Start();                       Console.ReadKey();        }

结果:

Start()和ContinueWith()的先后顺序没有关系,ContinueWith()会等待直到firstTask运行状态达到 IsCompleted,因为TaskContinuationOptions中的OnlyOnRanToCompletion.必须指出的是,ContinueWith()中的参数是需要以Task为参数的,也就是firstTask作为参数被传入,而且ContinueWith()运行在线程池中的线程中。我觉得比较重要的一点是:把ContinueWith()中的语句当做一块新的语句块,他们独立于主线程。无论如何,他们都要被判断,如果状态(status)不满足,那么他们不执行;当指定了多个状态,则使用合理的对应状态。

案例二:

代码:

    class Program    {        static int TaskMethod(string name, int seconds)        {            Console.WriteLine("Task Method : 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(seconds));            return 60 * seconds;        }        static void Main(string[] args)        {            Console.WriteLine("Main Thread id {0}, Is in Thred Pool: {1}",            Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);            var firstTask = new Task(() => TaskMethod("frist task", 3));            var secondTask = new Task(() => TaskMethod("second task", 2));            firstTask.ContinueWith(t => Console.WriteLine("Result:Frist Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}",            t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread),            TaskContinuationOptions.OnlyOnRanToCompletion);            firstTask.Start();            secondTask.Start();            Thread.Sleep(TimeSpan.FromSeconds(4)); //给予足够时间,让firstTask、secondTask及其后续操作执行完毕。            Task continuation = secondTask.ContinueWith(t => Console.WriteLine("Result:Second Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}",            t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread),            TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously);            Console.ReadLine();            Console.ReadKey();        }    }

结果:

这里主线程休眠了足足4秒钟,足以让firstTask和secondTask两个任务完成运行,而后,由于secondTask的后续除了接受OnlyOnRanToCompletion外,还接受ExecuteSynchronously。因此,后续运行中,由于主线程还没有结束,因此 ExecuteSynchronously得到认可,故secondTask的后续是在主线程上运行。

案例三:

代码:

    class Program    {        static int TaskMethod(string name, int seconds)        {            Console.WriteLine("Task Method : 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(seconds));            return 60 * seconds;        }        static void Main(string[] args)        {            Console.WriteLine("Main Thread id {0}, Is in Thred Pool: {1}",            Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);            var firstTask = new Task(() => TaskMethod("frist task", 3));            var secondTask = new Task(() => TaskMethod("second task", 2));            firstTask.ContinueWith(t => Console.WriteLine("Result:Frist Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}",            t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread),            TaskContinuationOptions.OnlyOnRanToCompletion);            firstTask.Start();            secondTask.Start();           //Thread.Sleep(TimeSpan.FromSeconds(4)); //给予足够时间,让firstTask、secondTask及其后续操作执行完毕。            Task continuation = secondTask.ContinueWith(t => Console.WriteLine("Result:Second Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}",            t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread),            TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously);            Console.ReadLine();            Console.ReadKey();        }    }

结果:

然而,如果把4秒钟的休眠注释掉,那么由于主线程很早就结束了,因此secondTask只能接受到OnlyOnRanToCompletion,因此还是运行在线程池中。

以上就是关于"C#连续任务Task.ContinueWith方法怎么用"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

任务 运行 线程 参数 内容 方法 案例 状态 结果 C# 代码 语句 也就是 文章 时间 知识 篇文章 休眠 处理 重要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技活动banner 互联网属科技 厦门中拓互联网络科技有限公司 互联网科技资迅 互联网科技的 麻工互联网科技 青岛互联网科技公司 远拓互联网科技 互联网科技公司名称 重庆科技学院互联网 互联网之后的科技是什么 栖莱科技互联网股份有限公司 注册互联网科技公司经营范围大全 互联网科技研发水平 威龙国际互联网科技公司 广州百诚互联网科技有限公司官网 互联网时代高科技布局 陕西彩京云互联网科技有限公司 互联网领先科技成果宣传视频 广东猫王互联网科技有限公司电话 互联网科技革命 天扬科技互联网广告 华脉科技工业互联网产品 互联网公司黑科技创始人 上海钢联属于互联网科技股吗 福建互联网展示科技馆设计 西安左小互联网科技有限公司 绵阳真晨互联网科技有限公司 杭州融税互联网科技有限公司 宁波允成互联网科技有限公司
0