C#基础知识学习之 ☀️ | 多线程的使用基础

简介: C#多线程多线程概念线程在程序中经常被用到,现在的计算机都是可以异步执行很多操作的,所以多线程的作用可见一斑!线程 被定义为程序的执行路径。每个线程都定义了一个独特的控制流。如果您的应用程序涉及到复杂的和耗时的操作,那么设置不同的线程执行路径往往是有益的,每个线程执行特定的工作。线程是轻量级进程。一个使用线程的常见实例是现代操作系统中并行编程的实现。使用线程节省了 CPU 周期的浪费,同时提高了应用程序的效率。到目前为止我们编写的程序是一个单线程作为应用程序的运行实例的单一的过程运行的。但是,这样子应用程序同时只能执行一个任务。为了同时执行多个任务,它可以被划分为更小的线程

线程的生命周期

线程生命周期开始于 System.Threading.Thread类的对象被创建时,结束于线程被终止或完成执行时。


下面列出了线程生命周期中的各种状态:


未启动状态:当线程实例被创建但 Start 方法未被调用时的状况。

就绪状态:当线程准备好运行并等待 CPU 周期时的状况。

不可运行状态:下面的几种情况下线程是不可运行的:

已经调用 Sleep 方法

已经调用 Wait 方法

通过 I/O 操作阻塞

死亡状态:当线程已完成执行或已中止时的状况。

主线程

在 C# 中,System.Threading.Thread 类用于线程的工作。它允许创建并访问多线程应用程序中的单个线程。进程中第一个被执行的线程称为主线程。


当 C# 程序开始执行时,主线程自动创建。使用 Thread类创建的线程被主线程的子线程调用。您可以使用Thread 类的 CurrentThread属性访问线程。


下面的程序演示了主线程的执行:

using System;
using System.Threading;
namespace MultithreadingApplication
{
    class MainThreadProgram
    {
        static void Main(string[] args)
        {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}

Thread 类常用的属性和方法

下表列出了Thread类的一些常用的 属性:

image.png下表列出了 Thread 类的一些常用的 方法:image.png

创建线程

线程是通过扩展 Thread类创建的。扩展的 Thread 类调用 Start()方法来开始子线程的执行。

下面的程序演示了这个概念:

using System;
using System.Threading;
namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");
        }
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:


In Main: Creating the Child thread

Child thread starts


管理线程

Thread类提供了各种管理线程的方法。


下面的实例演示了 sleep()方法的使用,用于在一个特定的时间暂停线程。

    void Start()
    {
        ThreadStart childref = new ThreadStart(CallToChildThread);
        Debug.Log("In Main: Creating the Child thread");
        Thread childThread = new Thread(childref);
        childThread.Start();
    }
    public static void CallToChildThread()
    {
        Debug.Log("子线程开启");
        // 线程暂停 5000 毫秒
        int sleepfor = 5000;
        Debug.Log("子线程等待 "+sleepfor / 1000+ " 秒");
        Thread.Sleep(sleepfor);
        Debug.Log("子线程唤醒");
    }

打印结果:

image.png

销毁线程

Abort()方法用于销毁线程。

通过抛出threadabortexception在运行时中止线程。这个异常不能被捕获,如果有finally块,控制会被送至finally块。

下面的程序说明了这点:

 void Start()
    {
        ThreadStart childref = new ThreadStart(CallToChildThread);
        Debug.Log("In Main: Creating the Child thread");
        Thread childThread = new Thread(childref);
        childThread.Start();
        // 停止主线程一段时间
        Thread.Sleep(2000);
        // 现在中止子线程
        Debug.Log("In Main: Aborting the Child thread");
        childThread.Abort();
    }
    public static void CallToChildThread()
    {
        try
        {
            Debug.Log("子线程开始");
            // 计数到 10
            for (int counter = 0; counter <= 10; counter++)
            {
                Thread.Sleep(500);
                Debug.Log(counter);
            }
            Debug.Log("子线程完成");
        }
        catch (ThreadAbortException e)
        {
            Debug.Log("线程中止异常:" + e);
        }
        finally
        {
            Debug.Log("无法捕获线程异常");
        }
    }

打印结果:

image.png

总结

多线程还有很多使用技巧,本篇博客就作为一篇引子简单介绍一下多线程的基础用法,包括创建、暂停和销毁等

后面会进行更深入的研究,包括线程锁等等用法!

相关文章
|
1月前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
4月前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
3月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
215 6
|
2月前
|
开发框架 缓存 算法
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
开源且实用的C#/.NET编程技巧练习宝库(学习,工作,实践干货)
|
3月前
|
Linux C# 开发者
Uno Platform 驱动的跨平台应用开发:从零开始的全方位资源指南与定制化学习路径规划,助您轻松上手并精通 C# 与 XAML 编程技巧,打造高效多端一致用户体验的移动与桌面应用程序
【9月更文挑战第8天】Uno Platform 的社区资源与学习路径推荐旨在为初学者和开发者提供全面指南,涵盖官方文档、GitHub 仓库及社区支持,助您掌握使用 C# 和 XAML 创建跨平台原生 UI 的技能。从官网入门教程到进阶技巧,再到活跃社区如 Discord,本指南带领您逐步深入了解 Uno Platform,并提供实用示例代码,帮助您在 Windows、iOS、Android、macOS、Linux 和 WebAssembly 等平台上高效开发。建议先熟悉 C# 和 XAML 基础,然后实践官方教程,研究 GitHub 示例项目,并积极参与社区讨论,不断提升技能。
114 2
|
3月前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
88 0
|
4月前
|
安全 C# 开发者
【C# 多线程编程陷阱揭秘】:小心!那些让你的程序瞬间崩溃的多线程数据同步异常问题,看完这篇你就能轻松应对!
【8月更文挑战第18天】多线程编程对现代软件开发至关重要,特别是在追求高性能和响应性方面。然而,它也带来了数据同步异常等挑战。本文通过一个简单的计数器示例展示了当多个线程无序地访问共享资源时可能出现的问题,并介绍了如何使用 `lock` 语句来确保线程安全。此外,还提到了其他同步工具如 `Monitor` 和 `Semaphore`,帮助开发者实现更高效的数据同步策略,以达到既保证数据一致性又维持良好性能的目标。
62 0
|
4月前
|
开发框架 .NET API
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
C#/.NET/.NET Core推荐学习书籍(24年8月更新)
111 0
|
5天前
|
NoSQL Redis
单线程传奇Redis,为何引入多线程?
Redis 4.0 引入多线程支持,主要用于后台对象删除、处理阻塞命令和网络 I/O 等操作,以提高并发性和性能。尽管如此,Redis 仍保留单线程执行模型处理客户端请求,确保高效性和简单性。多线程仅用于优化后台任务,如异步删除过期对象和分担读写操作,从而提升整体性能。
17 1