C#系列-并行处理+异步流(5)

2024-02-09 17:44

本文主要是介绍C#系列-并行处理+异步流(5),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,C#并行处理

 C#中,并行处理指的是同时执行多个任务或操作,以利用多核或多处理器的优势,从而提高应用程序的性能。C#提供了多种工具和框架来帮助开发者实现并行处理。以下是一些在C#中实现并行处理的方法:

  1. Parallel
    System.Threading.Tasks.Parallel 类提供了一系列静态方法,如 For, ForEach, Invoke 等,用于简化并行循环和操作的执行。

csharp代码

using System;

using System.Threading.Tasks;

class Program

{

static void Main()

{

// 使用 Parallel.For 并行执行循环

Parallel.For(0, 10, i =>

{

Console.WriteLine($"Processing {i} on thread {Thread.CurrentThread.ManagedThreadId}");

});

}

}

2.Task Parallel Library (TPL)
TPL 是基于任务的并行编程模型,它提供了 Task 和 Task<T> 类来表示异步操作。Task.Run 方法用于在线程池线程上异步执行代码。

csharp代码

using System;

using System.Threading.Tasks;

class Program

{

static async Task Main()

{

// 使用 Task.Run 在线程池上异步执行方法

Task task1 = Task.Run(() => DoWork("Task 1"));

Task task2 = Task.Run(() => DoWork("Task 2"));

// 等待所有任务完成

await Task.WhenAll(task1, task2);

Console.WriteLine("All tasks completed.");

}

static void DoWork(string taskName)

{

Console.WriteLine($"{taskName} is running on thread {Thread.CurrentThread.ManagedThreadId}");

// 模拟工作

Thread.Sleep(1000);

}

}

3.async await 关键字
这两个关键字用于编写异步方法,它们允许你以同步的方式编写异步代码,从而避免回调地狱和保持代码的清晰性。

csharp代码

using System;

using System.Threading.Tasks;

class Program

{

static async Task Main()

{

Console.WriteLine("Starting asynchronous operations...");

await Task.WhenAll(PerformAsyncOperation1(), PerformAsyncOperation2());

Console.WriteLine("All operations completed.");

}

static async Task PerformAsyncOperation1()

{

await Task.Run(() =>

{

Console.WriteLine("Async operation 1 is running on thread {0}", Thread.CurrentThread.ManagedThreadId);

// 模拟异步工作

Thread.Sleep(1000);

});

}

static async Task PerformAsyncOperation2()

{

await Task.Run(() =>

{

Console.WriteLine("Async operation 2 is running on thread {0}", Thread.CurrentThread.ManagedThreadId);

// 模拟异步工作

Thread.Sleep(1000);

});

}

}

4.数据并行处理
对于数据集合的处理,可以使用 Parallel.ForEach 或 Parallel.Invoke 来并行处理每个元素或操作。

csharp代码

using System;

using System.Collections.Generic;

using System.Threading.Tasks;

class Program

{

static void Main()

{

List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

// 使用 Parallel.ForEach 并行处理集合中的每个元素

Parallel.ForEach(numbers, number =>

{

Console.WriteLine($"Processing {number} on thread {Thread.CurrentThread.ManagedThreadId}");

});

}

}

5.取消操作
使用 CancellationToken 和 CancellationTokenSource 可以提供取消正在进行的并行或异步操作的能力。

csharp代码

using System;

using System.Threading;

using System.Threading.Tasks;

class Program

{

static void Main()

{

CancellationTokenSource cts = new CancellationTokenSource();

CancellationToken token = cts.Token;

Task task = Task.Run(() => DoWork(token), token);

// 在一段时间后取消任务

Thread.Sleep(2000);

cts.Cancel();

}

​​​​​​​二,异步流

 C#中,异步流(Asynchronous Streams)通常指的是使用异步编程模型(如asyncawait关键字)来处理数据流,这样可以避免阻塞调用线程,提高应用程序的响应性和性能。异步流在处理大量数据、网络请求或IO密集型操作时特别有用。

C#中,有几种方式可以处理异步流:

  1. 异步方法(Async Methods
    使用async和await关键字来编写异步方法,这些方法可以返回Task或Task<T>,并且可以在其中执行异步操作,如读取文件、访问网络等。

csharp代码

public async Task<Stream> GetStreamAsync()

{

// 模拟一个异步操作,例如从网络下载数据

await Task.Delay(1000);

return new MemoryStream(Encoding.UTF8.GetBytes("Some data"));

}

2.异步流处理(Asynchronous Stream Processing
使用StreamReader、StreamWriter、NetworkStream等类型的异步方法,可以逐块读取或写入数据,而不需要一次性加载整个流。

csharp代码

using (var stream = await GetStreamAsync())

using (var reader = new StreamReader(stream))

{

string line;

while ((line = await reader.ReadLineAsync()) != null)

{

// 处理每一行数据

Console.WriteLine(line);

}

}

3.异步枚举器(Asynchronous Enumerators
C# 8.0引入了异步枚举器,允许你创建可以异步迭代的集合。这通常用于实现异步数据流。

csharp代码

public async IAsyncEnumerable<int> GetAsyncEnumerable()

{

for (int i = 0; i < 10; i++)

{

await Task.Delay(100); // 模拟耗时操作

yield return i;

}

}

// 使用方式

foreach await (var item in GetAsyncEnumerable())

{

Console.WriteLine(item);

}

4.管道和流(Pipes and Streams
在.NET Core和.NET 5+中,System.IO.Pipes和System.Threading.Channels命名空间提供了额外的工具来创建和使用管道和通道,这些工具特别适合在进程间或线程间传递异步数据流。

csharp代码

var channel = Channel.CreateUnbounded<int>();

var reader = channel.Reader;

var writer = channel.Writer;

// 在一个任务中写入数据

Task.Run(async () =>

{

for (int i = 0; i < 10; i++)

{

await writer.WriteAsync(i);

await Task.Delay(100);

}

writer.Complete();

});

// 在另一个任务中读取数据

Task.Run(async () =>

{

while (await reader.WaitToReadAsync())

{

while (reader.TryRead(out var value))

{

Console.WriteLine(value);

}

}

});

在处理异步流时,重要的是要确保流的生命周期得到妥善管理,避免资源泄漏。使用using语句可以确保StreamStreamReaderStreamWriter等资源在使用后被正确释放。此外,当使用异步编程时,务必注意异常处理,因为异步操作可能会抛出未在调用线程上捕获的异常。

这篇关于C#系列-并行处理+异步流(5)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/694887

相关文章

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

C#下Newtonsoft.Json的具体使用

《C#下Newtonsoft.Json的具体使用》Newtonsoft.Json是一个非常流行的C#JSON序列化和反序列化库,它可以方便地将C#对象转换为JSON格式,或者将JSON数据解析为C#对... 目录安装 Newtonsoft.json基本用法1. 序列化 C# 对象为 JSON2. 反序列化

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅