前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >原来 C# 线程创建这么简单

原来 C# 线程创建这么简单

原创
作者头像
小明爱吃火锅
发布2024-02-06 16:09:43
2190
发布2024-02-06 16:09:43
举报
文章被收录于专栏:小明说Java小明说Java

前言

对于开发语言来说,线程是一个重要的知识点,当需要处理大量数据或执行复杂的操作时,使用多线程可以提高程序的性能和响应能力。相比其他语言,C# 也是提供了多种方式来实现多线程,本文将介绍 C# 多线程的基本概念和使用方法。

什么是多线程?

线程是操作系统中的基本调度单位,是程序执行的最小单位。多线程指的是一个程序中同时存在多个线程并发执行。每个线程有自己的代码执行路径和独立的堆栈空间,线程之间可以共享程序的数据段和代码段。其实概念大家都知道,这里就简单介绍一下。

如何创建线程?

在 C# 中,可以使用 System.Threading 命名空间中的类来创建和管理线程,C# 中创建线程的方式有两种:使用 Thread 类和使用 Task 类。可以看到,其实跟Java创建线程一样的,Java也是可以使用 Thread 类和 FutureTask(Callable),接下来就来讲解这两种方式如何创建线程的。

1. 使用 Thread 类

Thread 类是 C# 中用于创建和管理线程的基本类。创建线程的步骤如下:

  1. 创建 Thread 对象,并将线程执行的方法作为参数传递给 Thread 构造函数。
  2. 调用 Thread.Start 方法启动线程。
  3. 线程执行完毕后,调用 Thread.Join 方法等待线程退出。

如下代码,主要创建了一个新的线程,并在线程中执行一个简单的任务,主线程并等待子线程执行完之后,才开始。

代码语言:javascript
复制
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 创建一个新的线程
        Thread newThread = new Thread(WorkerThread);

        // 启动线程
        newThread.Start();

        // 等待线程结束
        newThread.Join();

        Console.WriteLine("Main 线程开始");
    }

    static void WorkerThread()
    {
        Console.WriteLine("子线程开始");

        // 模拟一些工作
        Thread.Sleep(1000);

        Console.WriteLine("子线程结束");
    }
}

上述代码,程序创建了一个新的线程并启动了它。线程执行的方法是 WorkerThread,该方法在控制台输出一些文本,然后模拟了一些工作(通过调用 Thread.Sleep 方法使线程休眠 1 秒),最后退出线程。结果如下:

2. 使用 Task 类

接下来,讲解另一种方式 使用 Task 类。Task 类是 .NET Framework 4.0 引入的一种新的线程模型。使用 Task 类创建线程的步骤如下:

  1. 使用 Task.Factory.StartNew 方法创建一个 Task 对象,并将线程执行的方法作为参数传递给 StartNew 方法。
  2. 可以使用 Task.ContinueWith 方法指定线程执行完毕后需要执行的代码。

以下是一个示例代码,该代码创建了一个新的线程,并在线程中执行一个简单的任务,代码跟上面使用Thread的方式一样。

代码语言:javascript
复制
using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // 创建一个新的 Task 对象
        Task newTask = Task.Factory.StartNew(WorkerTask);

        // 等待 Task 执行完毕
        newTask.Wait();

         Console.WriteLine("Main 线程开始");
    }

    static void WorkerTask()
    {
      Console.WriteLine("子线程开始");

        // 模拟一些工作

        Task.Delay(1000).Wait();

     Console.WriteLine("子线程结束");
    }
}




该示例中,程序创建了一个新的 Task 对象并启动了它。Task 执行的方法是 WorkerTask,该方法在控制台输出一些文本,然后模拟了一些工作(通过调用 Task.Delay 方法使线程休眠 1 秒),最后退出 Task。

线程池管理线程

在使用多线程时,频繁地创建和销毁线程会对系统性能产生不良影响。C# 中提供了线程池来解决这个问题。线程池是一个预先创建好的一组线程,程序可以将任务提交给线程池,线程池会自动分配空闲线程来执行任务。当任务执行完毕后,线程不会被销毁,而是返回到线程池中等待下一个任务的到来。

接下来,使用线程池的方式,C#线程池创建也是很简单,使用ThreadPool创建用户线程,修改上述代码,演示了如何使用线程池执行任务:

代码语言:javascript
复制
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 将任务提交给线程池
        ThreadPool.QueueUserWorkItem(WorkerTask, "Hello, World!");

        Console.WriteLine("Main 线程开始");
    }

    static void WorkerTask(object state)
    {
          Console.WriteLine("子线程开始");

        // 输出任务的参数
        Console.WriteLine(state);

        // 模拟一些工作
        Thread.Sleep(1000);

       Console.WriteLine("子线程结束");
    }
}

该示例中,程序将一个任务提交给线程池,并在任务中输出一些文本,然后模拟了一些工作。注意,在使用线程池时,需要使用 ThreadPool.QueueUserWorkItem 方法来将任务提交给线程池。

总结

本文介绍了 C# 中多线程的基本概念和使用方法,包括如何创建线程、如何实现线程同步和互斥、以及如何使用线程池执行任务。在使用多线程时,需要注意线程安全和性能问题,合理地使用线程同步和互斥机制和线程池,可以提高程序的性能和响应能力。可以看到,如果会Java的人来说,C#的线程创建方式与Java差不多的,所以上手也是比较快。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 什么是多线程?
  • 如何创建线程?
    • 1. 使用 Thread 类
      • 2. 使用 Task 类
      • 线程池管理线程
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com