iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在C#项目中实现并行和多线程编程
  • 211
分享到

怎么在C#项目中实现并行和多线程编程

2023-06-06 11:06:26 211人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关怎么在C#项目中实现并行和多线程编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 一、Task的嵌套   Task中还可以再嵌套Task,Threa

这期内容当中小编将会给大家带来有关怎么在C#项目中实现并行和多线程编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

 一、Task的嵌套

   Task中还可以再嵌套Task,Thread中能不能这样做,我只能说我是没这样写过。Task中的嵌套,我感觉其实也可以分开来写,不过嵌套起来会方便管理一点。Task中的嵌套分为两种,关联嵌套和非关联嵌套,就是说内层的Task和外层的Task是否有联系,下面我们编写代码先来看一下非关联嵌套,及内层Task和外层Task没有任何关系,还是在控制台程序下面,代码如下:

static void Main(string[] args)   {     var pTask = Task.Factory.StartNew(() =>      {      var cTask = Task.Factory.StartNew(() =>      {        System.Threading.Thread.Sleep(2000);        Console.WriteLine("Childen task finished!");      });      Console.WriteLine("Parent task finished!");     });     pTask.Wait();     Console.WriteLine("Flag");     Console.Read();   }

运行后,输出以下信息:

怎么在C#项目中实现并行和多线程编程

从图中我们可以看到,外层的pTask运行完后,并不会等待内层的cTask,直接向下走先输出了Flag。这种嵌套有时候相当于我们创建两个Task,但是嵌套在一起的话,在Task比较多时会方便查找和管理,并且还可以在一个Task中途加入多个Task,让进度并行前进。

下面我们来看一下如何创建关联嵌套,就是创建有父子关系的Task,修改上面代码如下:

static void Main(string[] args)   {     var pTask = Task.Factory.StartNew(() =>      {      var cTask = Task.Factory.StartNew(() =>      {        System.Threading.Thread.Sleep(2000);        Console.WriteLine("Childen task finished!");      },TaskCreationOptions.AttachedToParent);      Console.WriteLine("Parent task finished!");     });     pTask.Wait();     Console.WriteLine("Flag");     Console.Read();   }

可以看到,我们在创建cTask时,加入了以参数,TaskCreationOptions.AttachedToParent,这个时候,cTask和pTask就会建立关联,cTask就会成为pTask的一部分,运行代码,看下结果:

怎么在C#项目中实现并行和多线程编程

可以看到,tTask会等待cTask执行完成。省得我们写Task.WaitAll了,外层的Task会自动等待所有的子Task完成才向下走。

下面我们来写一个Task综合使用的例子,来看一下多任务是如何协作的。假设有如下任务,如图:

怎么在C#项目中实现并行和多线程编程

任务2和任务3要等待任务1完成后,取得任务1的结果,然后开始执行。任务4要等待任务2完成,取得其结果才能执行,最终任务3和任务4都完成了,合并结果,任务完成。图中已经说的很明白了。下面来看一下代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace TaskDemo{  class Program  {    static void Main(string[] args)    {      Task.Factory.StartNew(() =>      {        var t1 = Task.Factory.StartNew<int>(() =>         {          Console.WriteLine("Task 1 running...");          return 1;        });        t1.Wait(); //等待任务一完成        var t3 = Task.Factory.StartNew<int>(() =>        {          Console.WriteLine("Task 3 running...");          return t1.Result + 3;        });        var t4 = Task.Factory.StartNew<int>(() =>        {          Console.WriteLine("Task 2 running...");          return t1.Result + 2;        }).ContinueWith<int>(task =>        {          Console.WriteLine("Task 4 running...");          return task.Result + 4;        });        Task.WaitAll(t3, t4); //等待任务三和任务四完成        var result = Task.Factory.StartNew(() =>        {          Console.WriteLine("Task Finished! The result is {0}",t3.Result + t4.Result);        });      });      Console.Read();    }  }}

任务2和任务4可以用ContinueWith连接执行,最终运行结果如图:

怎么在C#项目中实现并行和多线程编程

可以看到所有的任务都执行了,我们也得到了正确的结果11.这下体会到Task的强大了吧~

 二、Task的异常处理

   任何应用程序都需要有异常处理机制,谁也不能保证自己写到代码在任何时候都是可以正常运行的,那么在Task中到底该怎么处理异常呢?先来按照平时的写法,加个Try...Catch...试试,看看会出现什么现象:

static void Main(string[] args)   {     try     {      var pTask = Task.Factory.StartNew(() =>      {        var cTask = Task.Factory.StartNew(() =>        {         System.Threading.Thread.Sleep(2000);         throw new Exception("cTask Error!");         Console.WriteLine("Childen task finished!");        });        throw new Exception("pTask Error!");        Console.WriteLine("Parent task finished!");      });      pTask.Wait();     }     catch (Exception ex)     {      Console.WriteLine(ex.Message);     }     Console.WriteLine("Flag");     Console.Read();   }

大家都看得懂,就不解释了,直接F5运行,结果如图:

怎么在C#项目中实现并行和多线程编程

唉,不对啊~~怎么显示这异常信息呢?先不说异常信息对不对,反正异常是捕获到了。从这张图中你们还发现了什么吗?

没错,cTask被中断了,这里cTask和pTask并没有建立关联,但是pTask出现异常,其内部的Task也都会中断,不再执行,即使异常是在子Task启动以后发生的。

下面我们继续来说异常吧,来看看正确的异常处理办法,怎么捕获到真正的异常信息,代码如下:

static void Main(string[] args)   {     try     {      var pTask = Task.Factory.StartNew(() =>      {        var cTask = Task.Factory.StartNew(() =>        {         System.Threading.Thread.Sleep(2000);         throw new Exception("cTask Error!");         Console.WriteLine("Childen task finished!");        });        throw new Exception("pTask Error!");        Console.WriteLine("Parent task finished!");      });      pTask.Wait();     }     catch (AggregateException ex)     {      foreach (Exception inner in ex.InnerExceptions)      {        Console.WriteLine(inner.Message);      }     }     Console.WriteLine("Flag");     Console.Read();   }

这里用了AggregateException,就是异常集合,当然开发中不会只有一个线程,肯定会有多个线程,多个线程就可能有多个异常。我们变量异常集合,输出异常信息,如下图:

怎么在C#项目中实现并行和多线程编程

上述就是小编为大家分享的怎么在C#项目中实现并行和多线程编程了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在C#项目中实现并行和多线程编程

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在C#项目中实现并行和多线程编程
    这期内容当中小编将会给大家带来有关怎么在C#项目中实现并行和多线程编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 一、Task的嵌套   Task中还可以再嵌套Task,Threa...
    99+
    2023-06-06
  • 如何在C#项目中使用Task实现并行和多线程编程
    这期内容当中小编将会给大家带来有关如何在C#项目中使用Task实现并行和多线程编程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。任务和线程的区别:任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执...
    99+
    2023-06-06
  • 怎么在c#中使用Parallelx实现并行和多线程编程
    本篇文章给大家分享的是有关怎么在c#中使用Parallelx实现并行和多线程编程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、 Parallel的使用Parallel.In...
    99+
    2023-06-06
  • 多线程并发编程如何在Java项目中实现
    本篇文章为大家展示了多线程并发编程如何在Java项目中实现 ,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、多线程操作系统有两个容易混淆的概念,进程和线程。进程:一个计算机程序的运行实例,包含了需...
    99+
    2023-05-31
    java 多线程 并发编程
  • 在Java项目中实现多线程并发编程的方法
    在Java项目中实现多线程并发编程的方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java 中的锁通常分为两种:通过关键字 synchronized 获取的...
    99+
    2023-05-31
    并发 java并发 多线程
  • 在java项目中使用线程池实现并发编程
    今天就跟大家聊聊有关在java项目中使用线程池实现并发编程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、任务和执行策略之间的隐性耦合Executor可以将任务的提交和任务的执行策...
    99+
    2023-05-31
    java 线程池 并发编程
  • c语言多线程并行怎么实现
    在C语言中,可以使用pthread库来实现多线程并行。1. 首先,需要包含pthread.h头文件。```c#include ```...
    99+
    2023-09-14
    c语言
  • C#怎么实现多线程编程
    本文小编为大家详细介绍“C#怎么实现多线程编程”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现多线程编程”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、使用线程的理由可以使用线程将代码同其他代码隔离...
    99+
    2023-06-30
  • Java项目中实现多线程并发编程的条件有哪些
    这期内容当中小编将会给大家带来有关Java项目中实现多线程并发编程的条件有哪些,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、原子性原子,一个不可再被分割的颗粒。原子性,指的是一个或多个不能再被分割的操...
    99+
    2023-05-31
    java 并发编程 多线程
  • 在Java项目中怎么样实现调度多线程
    在Java项目中怎么样实现调度多线程?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。        方法一:设置线程优先级。...
    99+
    2023-05-31
    java 多线程 ava
  • java多线程在项目中怎么应用
    Java多线程在项目中的应用主要有以下几个方面:1. 提高程序的并发性:多线程可以同时处理多个任务,提高程序的并发性,使得程序的执行...
    99+
    2023-09-29
    java
  • 在java项目中如何实现同步多线程
    本篇文章给大家分享的是有关在java项目中如何实现同步多线程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 java多线程的同步方法实例代码先看一个段有关银行存钱的代...
    99+
    2023-05-31
    java 多线程 同步
  • 怎么在java中实现多线程高并发
    这篇文章将为大家详细讲解有关怎么在java中实现多线程高并发,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.JMM数据原子操作read(读取)∶从主内存读取数据load(载入):将主内存读...
    99+
    2023-06-14
  • java怎么实现多线程并发执行
    Java实现多线程并发执行的方式有两种:继承Thread类和实现Runnable接口。 继承Thread类: 定义一个类,继承...
    99+
    2023-10-25
    java
  • java多线程并发执行怎么实现
    在Java中实现多线程的并发执行有多种方式,以下是其中的几种常见方法:1. 继承Thread类:创建一个继承自Thread类的子类,...
    99+
    2023-09-27
    java
  • 怎么在linux系统中实现openmp多线程编程
    本篇文章给大家分享的是有关怎么在linux系统中实现openmp多线程编程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。关键语法:代码如下:#inlcude <omp.h...
    99+
    2023-06-13
  • Python并行编程多线程锁机制Lock与RLock实现线程同步
    目录什么是锁机制?Lock() 管理线程RLock() 与Lock()的区别什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制。前面我们谈到一个进程内的多个线程的某些资...
    99+
    2024-04-02
  • Lua中怎么进行多线程编程
    在Lua中进行多线程编程可以使用Lua的Coroutine特性来实现。Coroutine是一种协作式多任务处理方式,可以模拟多线程的...
    99+
    2024-04-09
    Lua
  • Java中怎样实现多线程编程
    今天就跟大家聊聊有关Java中怎样实现多线程编程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、理解Java多线程编程Java多线程编程是这样一种机制,它允许在程序中并发执行多个指...
    99+
    2023-06-17
  • 在Java项目中实现多线程的方法有哪些
    在Java项目中实现多线程的方法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java中,有两种方式可以创建多线程:1 通过继承Thread类,重写Thread的run(...
    99+
    2023-05-31
    java 多线程 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作