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#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

C#实现SHP文件读取与地图显示的完整教程

《C#实现SHP文件读取与地图显示的完整教程》在地理信息系统(GIS)开发中,SHP文件是一种常见的矢量数据格式,本文将详细介绍如何使用C#读取SHP文件并实现地图显示功能,包括坐标转换、图形渲染、平... 目录概述功能特点核心代码解析1. 文件读取与初始化2. 坐标转换3. 图形绘制4. 地图交互功能缩放

C#使用SendMessage实现进程间通信的示例代码

《C#使用SendMessage实现进程间通信的示例代码》在软件开发中,进程间通信(IPC)是关键技术之一,C#通过调用WindowsAPI的SendMessage函数实现这一功能,本文将通过实例介绍... 目录第一章:SendMessage的底层原理揭秘第二章:构建跨进程通信桥梁2.1 定义通信协议2.2

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

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