当前位置: 首页 > article >正文

.net core 实现多线程方式有哪些

在 .NET Core 中,有多种方式可以实现多线程编程。这些方式包括使用 Thread 类、TaskParallel 类库。每种方法都有其适用场景和优缺点。下面我将通过代码示例来展示这些不同的多线程实现方式。

1. 使用 Thread 类

Thread 类是 .NET 中最基本的多线程实现方式。它允许你创建和管理线程,但通常不推荐用于新项目,因为 TaskParallel 提供了更高级的抽象和更好的性能。

示例代码
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 创建一个新的线程
        Thread thread = new Thread(new ThreadStart(DoWork));
        thread.Start();

        // 主线程继续执行其他操作
        Console.WriteLine("Main thread is doing other work...");

        // 等待子线程完成
        thread.Join();

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

    static void DoWork()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} - Iteration {i}");
            Thread.Sleep(500); // 模拟耗时操作
        }
    }
}

2. 使用 Task 和 async/await

Task 是 .NET 中处理异步操作的核心类。asyncawait 关键字提供了更简洁和易读的异步编程模型。

示例代码
using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // 启动一个异步任务
        Task task = DoWorkAsync();

        // 主线程继续执行其他操作
        Console.WriteLine("Main thread is doing other work...");

        // 等待异步任务完成
        await task;

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

    static async Task DoWorkAsync()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"Task {Task.CurrentId} - Iteration {i}");
            await Task.Delay(500); // 模拟耗时操作
        }
    }
}

3. 使用 Parallel 类

Parallel 类提供了并行循环和并行区域的支持,适用于数据并行处理。它会自动将工作负载分配到多个线程上。

示例代码
using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 并行循环
        Parallel.For(0, 5, i =>
        {
            Console.WriteLine($"Parallel iteration {i} on thread {Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(500); // 模拟耗时操作
        });

        Console.WriteLine("Parallel loop completed.");
    }
}

4. 使用 ThreadPool

ThreadPool 提供了一个线程池,可以复用线程以提高性能。适用于需要频繁创建和销毁线程的情况。

示例代码
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 将工作项添加到线程池
        ThreadPool.QueueUserWorkItem(_ => DoWork());

        // 主线程继续执行其他操作
        Console.WriteLine("Main thread is doing other work...");

        // 等待用户输入以保持主线程运行
        Console.ReadLine();
    }

    static void DoWork()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"ThreadPool iteration {i} on thread {Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(500); // 模拟耗时操作
        }
    }
}

5. 使用 Parallel.ForEach

Parallel.ForEachParallel 类中的另一个常用方法,适用于对集合进行并行处理。

示例代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        List<int> numbers = Enumerable.Range(1, 5).ToList();

        // 并行处理列表
        Parallel.ForEach(numbers, number =>
        {
            Console.WriteLine($"Processing number {number} on thread {Thread.CurrentThread.ManagedThreadId}");
            Thread.Sleep(500); // 模拟耗时操作
        });

        Console.WriteLine("Parallel foreach completed.");
    }
}

总结

  • Thread:最基本的多线程实现方式,适用于简单的线程管理。
  • Task 和 async/await:提供更高级的异步编程模型,适用于 I/O 密集型操作。
  • Parallel:适用于数据并行处理,如并行循环和并行区域。
  • ThreadPool:适用于频繁创建和销毁线程的情况,提高性能。
  • Parallel.ForEach:适用于对集合进行并行处理。

选择哪种方式取决于你的具体需求和应用场景。对于大多数现代 .NET 应用程序,推荐使用 Taskasync/await 以及 Parallel 类库,因为它们提供了更好的性能和更简洁的代码。


http://www.kler.cn/a/354893.html

相关文章:

  • Docker部署Sentinel
  • CSS系列(36)-- Containment详解
  • 【Linux】进程间通信 -> 匿名管道命名管道
  • AppAgent 源码 (xml 解析)
  • 全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
  • DX12 快速教程(2) —— 渲染天蓝色窗口
  • spring 如何解决循环依赖
  • 《米小圈动画成语》|在趣味中学习,在快乐中掌握成语知识!
  • C++11新特性(4)
  • 5、JavaScript(二)
  • java面试-每日随机(1014)
  • 接口测试常用工具及测试方法
  • Android 第5种启动模式:singleInstancePerTask
  • Leetcode 单词规律
  • 15分钟学Go 实战项目一:命令行工具
  • JavaWeb合集02-Vue基础内容
  • 虚拟化桌面
  • Parasoft C/C++test CT 荣获TÜV SÜD认证,在安全关键应用开发与验证方面达到最佳实践标准
  • 空间解析几何 3:空间点到线段和平面的距离【附MATLAB代码】
  • 面对专利档案管理难题,我们该怎么办?
  • 用Java爬虫API,轻松获取电商商品SKU信息
  • 怎么在地图导航上添加自己的店面定位?
  • Centos7默认的python版本是2.7,现在很多新开发的python均需要3.X以上。下面升级centos的预装python版本到最新。
  • Python123练习题
  • Python网络爬虫:分析淘宝商品热度与销量[进阶深度优化]
  • 查看SQL执行计划 explain