首页 > 编程语言 >C# 中的并发和并行

C# 中的并发和并行

时间:2024-07-02 09:01:52浏览次数:19  
标签:异步 Console C# 编程 并行 并发

介绍

并发和并行是现代编程中的关键概念,可帮助开发人员创建高效、响应迅速、高性能的应用程序。在 C# 中,这些概念尤其重要,因为该语言对多线程和异步编程提供了强大的支持。本文介绍了 C# 中的并发和并行,包括关键概念、优点和实际示例。

并发

C# 中的并发涉及同时管理多个任务。它允许程序在重叠时间处理多个操作,这对于创建响应式应用程序至关重要。并发是使用多线程和异步编程等技术实现的。

并行性

另一方面,并​​行是指同时执行多个任务。这通常是通过将问题划分为可以并行处理的较小子问题来实现的,从而利用多个 CPU 内核。并行可以显著提高计算密集型任务的性能。

C# 中并发和并行的关键概念

线程

线程是并发编程中的基本执行单元。在 C# 中,可以使用 System.Threading 命名空间创建和管理线程。

异步编程

C# 中的异步编程主要通过 async 和 await 关键字支持,它们允许方法异步运行,从而更好地利用系统资源并提高响应能力。

并行编程

System.Threading.Tasks 命名空间支持 C# 中的并行编程,其中包括用于创建和管理并行任务的 Parallel 类和任务并行库 (TPL)。

示例

让我们探索一个演示 C# 中的并发性和并行性的示例。我们将创建一个执行两项任务的简单程序:读取文件和执行 CPU 密集型计算。

步骤 1. 设置项目

首先,在您喜欢的开发环境中创建一个新的 C# 控制台应用程序项目。

步骤 2. 使用异步编程实现并发

我们将首先使用异步编程实现并发,以读取文件而不阻塞主线程。

using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Starting file read..."); // 开始读取文件...
        
        // 启动异步文件读取操作
        Task<string> readFileTask = ReadFileAsync("example.txt");
        
        // 在读取文件的同时执行其他操作
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine($"Doing other work... {i}"); // 执行其他工作... {i}
            await Task.Delay(500); // 模拟其他工作
        }
        
        // 等待文件读取操作完成
        string fileContent = await readFileTask;
        Console.WriteLine($"File content: {fileContent}"); // 文件内容:{fileContent}
    }

    static async Task<string> ReadFileAsync(string filePath)
    {
        using (StreamReader reader = new StreamReader(filePath))
        {
            return await reader.ReadToEndAsync(); // 异步读取文件内容直到结束
        }
    }
}

步骤 3. 使用 Parallel 类实现并行

接下来,我们将通过使用 Parallel 类并行执行 CPU 密集型计算来演示并行性。

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Starting parallel computation..."); // 开始并行计算...
        
        // 执行并行计算
        Parallel.For(0, 10, i =>
        {
            Console.WriteLine($"Processing index {i} on thread {Task.CurrentId}"); // 在线程 {Task.CurrentId} 上处理索引 {i}
            
            // 模拟一个CPU密集型任务
            PerformComputation(i);
        });
        
        Console.WriteLine("Parallel computation completed."); // 并行计算完成。
    }

    static void PerformComputation(int index)
    {
        // 模拟一个CPU密集型计算
        double result = 0;
        for (int i = 0; i < 1_000_000; i++)
        {
            result += Math.Sqrt(i + index);
        }
        Console.WriteLine($"Computation result for index {index}: {result}"); // 索引 {index} 的计算结果:{result}
    }
}

结论

并发性和并行性是提高应用程序性能和响应能力的强大工具。在 C# 中,这些概念通过异步编程和任务并行库得到很好的支持。通过利用这些技术,开发人员可以创建高效管理多个任务并有效利用系统资源的应用程序。此处提供的示例演示了在 C# 中实现并发性和并行性的基础知识,可作为更复杂和可扩展的应用程序的基础。

标签:异步,Console,C#,编程,并行,并发
From: https://blog.csdn.net/xiefeng240601/article/details/140100308

相关文章

  • C++文件输入输出
    参考博文:https://blog.csdn.net/houbincarson/article/details/136327765/*文件输入输出fstream有三个文件流类:std::ifstream:用于从文件中读取数据的输入流对象。std::ofstream:用于向文件中写入数据的输出流对象。std::fstream:用于读写文件的输入输出流对象。*/#include<f......
  • Oracle 上机
    --1.(3分)查找每个部门的最高工资员工编号及其下属信息。selecte2.empno,e1.*fromempe1join(select*fromempwhere(deptno,sal)in(selectdeptno,max(sal)fromempgroupbydeptno))e2one1.mgr=e2.empno;/*2.(5分)有成绩表如下(使用with子查询):准考证号科......
  • Oracle day15
    /*createtablef0307(idnumber,productnamevarchar2(100),parentidnumber);insertintof0307values(1,'汽车',null);insertintof0307values(2,'车身',1);insertintof0307values(3,'发动机',1);insertintof0307values(4......
  • camunda多租户技术架构介绍和测试验证
    多租户考虑的是单个Camunda安装应该为多个租户提供服务的情况。对于每个租户,应做出一定的隔离保证。例如,一个租户的流程实例不应干扰另一租户的流程实例。多租户可以通过两种不同的方式实现。一种方法是每个租户使用一个流程引擎。另一种方法是仅使用一个流程引擎并将数据与租......
  • Oracle day14
    /*createtablef0810(idnumber,timesvarchar2(50));insertintof0810values(1,'2019-12-2511:01');insertintof0810values(2,'2019-12-2511:03');insertintof0810values(3,'2019-12-2511:05');insertintof0810values(4,......
  • camunda数据库表结构详细说明
    本文基于Camunda7.19.0版本,介绍Camunda开源工作流引擎的数据库架构和ER模型,Camunda7.19.0共49张表,包括了BPMN流程引擎、DMN规则引擎、CMMN引擎、历史数据、用户身份等方面的表结构定义,以及表与表之间的关联关系。1、camunda数据库结构综述Camunda流程引擎的数据库架构由多个表组......
  • C#面:实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复
    对生成的数组排序,需要支持升序、降序两种顺序usingSystem;usingSystem.Collections.Generic;classProgram{staticvoidMain(string[]args){Randomrandom=newRandom();HashSet<int>set=newHashSet<int>();while(set.C......
  • 用质因数求解最大公约数(gcd)和最小公倍数(lcm)
    用质因数求解最大公约数(gcd)思路分析:1、质因数:(素因数或质因子)他指的是能整除给定正整数的质数。例如:36可以分解为223*3,其中2和3就是质因数。2、质因数求解最大公约数:对每个数进行质因数分解;找出所有数的共有质因数,并取每个共有质因数的最低次幂;将这些最低次幂的质因......
  • 【Spark Core】RDD详解
    一、RDD基本介绍1、为什么需要RDD没有RDD之前:1.MR:只提供了map和reduce的API,而且编写麻烦,运行效率低!---早淘汰了!2.使用Python/Scala/Java的本地集合:但是只能完成本地单机版的,如果要实现分布式的,---很困难!  所以需要有一个分布式的数据抽象,也就是用该抽象,可......
  • Qt QTableWidget resizeRowsToContents非常慢
    QTableWidget是Qt框架中的一个表格控件,用于显示和编辑表格数据。resizeRowsToContents是QTableWidget的一个函数,用于自动调整表格行的高度以适应内容。该函数在某些情况下可能会导致性能问题,特别是当表格中的行数较多或者表格中的内容较复杂时。这是因为该函数需要遍......