C#中怎么实现并行编程

发布时间:2021-07-07 15:15:46 作者:Leah
来源:亿速云 阅读:349

C#中怎么实现并行编程

在现代软件开发中,随着多核处理器的普及,并行编程变得越来越重要。C# 提供了多种方式来实现并行编程,以提高应用程序的性能和响应速度。本文将详细介绍如何在 C# 中实现并行编程,包括使用 TaskParallel 类、PLINQ 以及 async/await 等机制。

1. 并行编程的基本概念

并行编程是指在同一时间内执行多个任务,以充分利用多核处理器的计算能力。与传统的串行编程相比,并行编程可以显著提高程序的执行效率,尤其是在处理大量数据或执行复杂计算时。

在 C# 中,并行编程主要通过以下几种方式实现:

2. 使用 Task 类实现并行编程

Task 类是 C# 中用于表示异步操作的基本单元。通过 Task,可以轻松地创建和管理并行任务。

2.1 创建和启动 Task

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Task task1 = Task.Run(() => DoWork("Task 1"));
        Task task2 = Task.Run(() => DoWork("Task 2"));

        Task.WaitAll(task1, task2);
        Console.WriteLine("All tasks completed.");
    }

    static void DoWork(string taskName)
    {
        Console.WriteLine($"{taskName} is running on thread {Task.CurrentId}");
        Task.Delay(1000).Wait(); // 模拟耗时操作
        Console.WriteLine($"{taskName} completed.");
    }
}

在上面的代码中,我们使用 Task.Run 方法创建了两个并行任务 task1task2,并通过 Task.WaitAll 方法等待它们完成。

2.2 使用 Task 返回值

Task 还可以返回一个值,通过 Task<TResult> 类型来表示。

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Task<int> task1 = Task.Run(() => CalculateSum(1, 10));
        Task<int> task2 = Task.Run(() => CalculateSum(11, 20));

        int result1 = task1.Result;
        int result2 = task2.Result;

        Console.WriteLine($"Sum of 1-10: {result1}");
        Console.WriteLine($"Sum of 11-20: {result2}");
    }

    static int CalculateSum(int start, int end)
    {
        int sum = 0;
        for (int i = start; i <= end; i++)
        {
            sum += i;
        }
        return sum;
    }
}

在这个例子中,task1task2 分别计算了 1 到 10 和 11 到 20 的和,并通过 Result 属性获取了计算结果。

3. 使用 Parallel 类实现并行编程

Parallel 类提供了简单的并行循环和并行任务执行的方法,适用于需要对集合进行并行处理的场景。

3.1 使用 Parallel.For

Parallel.For 方法可以并行地执行一个循环。

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        Parallel.For(0, 10, i =>
        {
            Console.WriteLine($"Task {i} is running on thread {Task.CurrentId}");
            Task.Delay(1000).Wait(); // 模拟耗时操作
            Console.WriteLine($"Task {i} completed.");
        });

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

在这个例子中,Parallel.For 并行地执行了 10 个任务,每个任务都会打印当前任务的编号和线程 ID。

3.2 使用 Parallel.ForEach

Parallel.ForEach 方法可以并行地遍历一个集合。

using System;
using System.Collections.Generic;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        List<string> items = new List<string> { "Item1", "Item2", "Item3", "Item4", "Item5" };

        Parallel.ForEach(items, item =>
        {
            Console.WriteLine($"Processing {item} on thread {Task.CurrentId}");
            Task.Delay(1000).Wait(); // 模拟耗时操作
            Console.WriteLine($"Completed processing {item}.");
        });

        Console.WriteLine("All items processed.");
    }
}

在这个例子中,Parallel.ForEach 并行地处理了 items 列表中的每个元素。

4. 使用 PLINQ 实现并行编程

PLINQ (Parallel LINQ) 是 LINQ 的并行版本,允许对集合进行并行查询。

4.1 使用 AsParallel 方法

AsParallel 方法可以将 LINQ 查询转换为并行查询。

using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var numbers = Enumerable.Range(1, 100);

        var evenNumbers = numbers.AsParallel()
                                 .Where(n => n % 2 == 0)
                                 .OrderBy(n => n)
                                 .ToList();

        Console.WriteLine("Even numbers:");
        foreach (var number in evenNumbers)
        {
            Console.WriteLine(number);
        }
    }
}

在这个例子中,AsParallel 方法将 numbers 集合的查询转换为并行查询,从而加速了查询过程。

4.2 使用 WithDegreeOfParallelism 方法

WithDegreeOfParallelism 方法可以指定并行查询的最大并行度。

using System;
using System.Linq;

class Program
{
    static void Main(string[] args)
    {
        var numbers = Enumerable.Range(1, 100);

        var evenNumbers = numbers.AsParallel()
                                 .WithDegreeOfParallelism(4)
                                 .Where(n => n % 2 == 0)
                                 .OrderBy(n => n)
                                 .ToList();

        Console.WriteLine("Even numbers:");
        foreach (var number in evenNumbers)
        {
            Console.WriteLine(number);
        }
    }
}

在这个例子中,WithDegreeOfParallelism(4) 指定了并行查询的最大并行度为 4。

5. 使用 async/await 实现异步编程

async/await 是 C# 中用于编写异步代码的关键字,可以避免阻塞主线程,提高应用程序的响应速度。

5.1 使用 async/await 编写异步方法

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Starting async tasks...");

        Task task1 = DoWorkAsync("Task 1");
        Task task2 = DoWorkAsync("Task 2");

        await Task.WhenAll(task1, task2);

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

    static async Task DoWorkAsync(string taskName)
    {
        Console.WriteLine($"{taskName} is running on thread {Task.CurrentId}");
        await Task.Delay(1000); // 模拟耗时操作
        Console.WriteLine($"{taskName} completed.");
    }
}

在这个例子中,DoWorkAsync 方法是一个异步方法,使用 await 关键字等待耗时操作完成。Main 方法使用 await Task.WhenAll 等待所有异步任务完成。

5.2 使用 async/await 返回值

异步方法也可以返回一个值。

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("Starting async tasks...");

        Task<int> task1 = CalculateSumAsync(1, 10);
        Task<int> task2 = CalculateSumAsync(11, 20);

        int result1 = await task1;
        int result2 = await task2;

        Console.WriteLine($"Sum of 1-10: {result1}");
        Console.WriteLine($"Sum of 11-20: {result2}");
    }

    static async Task<int> CalculateSumAsync(int start, int end)
    {
        int sum = 0;
        for (int i = start; i <= end; i++)
        {
            sum += i;
            await Task.Delay(100); // 模拟耗时操作
        }
        return sum;
    }
}

在这个例子中,CalculateSumAsync 方法是一个异步方法,返回一个 int 类型的值。Main 方法使用 await 关键字获取异步方法的返回值。

6. 总结

C# 提供了多种方式来实现并行编程,包括 TaskParallel 类、PLINQ 以及 async/await 等机制。通过合理地使用这些工具,可以显著提高应用程序的性能和响应速度。在实际开发中,应根据具体需求选择合适的并行编程方式,并注意避免常见的并发问题,如死锁和竞态条件。

推荐阅读:
  1. python 多进程并行编程 ProcessPoolExecutor的实现
  2. 在Java中如何使用Callable、Future进行并行编程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

上一篇:C#中怎么将csv数据转换为DataTable

下一篇:C#中怎么实现字体加密功能

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》