c# Thread类线程常用操作详解

c#Thread类线程常用操作详解

什么是Thread类

Thread 类提供了访问和操作线程的一系列方法和属性。开发人员可以新建和控制线程、设置线程的优先级、执行线程的暂停、继续、等待操作等。Thread 类定义在 System.Threading 命名空间中。

如何创建一个线程

使用 Thread 类来创建一个新线程:

Thread thread1 = new Thread(new ThreadStart(MyThreadMethod));

这里新建了一个名为 thread1 的线程,它会执行一个名为 MyThreadMethod 的方法。该方法具有以下声明:

static void MyThreadMethod()
{
    // 线程要执行的代码
}

常用Thread方法和属性

Thread.Start 方法

使用 Start 方法来启动一个线程:

Thread thread1 = new Thread(new ThreadStart(MyThreadMethod));
thread1.Start();

Thread.Join 方法

使用 Join 方法来等待线程完成运行:

Thread thread1 = new Thread(new ThreadStart(MyThreadMethod));
thread1.Start();
thread1.Join();

Thread.Sleep 方法

使用 Sleep 方法来让线程暂停一段时间:

Thread.Sleep(1000); // 等待 1 秒钟

Thread.Abort 方法

使用 Abort 方法来中止一个正在运行的线程:

Thread thread1 = new Thread(new ThreadStart(MyThreadMethod));
thread1.Start();
// 假设需要等待 5 秒钟后再手动中止线程
Thread.Sleep(5000);
thread1.Abort();

Thread.IsAlive 属性

使用 IsAlive 属性来判断线程是否正在运行:

Thread thread1 = new Thread(new ThreadStart(MyThreadMethod));
thread1.Start();
while (thread1.IsAlive) {}
Console.WriteLine("线程已结束");

示例 1:计算素数

下面是一个计算素数的简单示例。我们会创建两个线程来计算 1~500 和 501~1000 的素数,然后将它们的结果输出:

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        Thread thread1 = new Thread(new ThreadStart(CalculatePrimeNumbers1));
        Thread thread2 = new Thread(new ThreadStart(CalculatePrimeNumbers2));
        thread1.Start();
        thread2.Start();
        thread1.Join();
        thread2.Join();
        Console.Read();
    }

    static void CalculatePrimeNumbers1()
    {
        for (int i = 2; i <= 500; i++)
        {
            bool isPrime = true;
            for (int j = 2; j < i; j++)
            {
                if (i % j == 0)
                {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) Console.WriteLine(i);
        }
    }

    static void CalculatePrimeNumbers2()
    {
        for (int i = 501; i <= 1000; i++)
        {
            bool isPrime = true;
            for (int j = 2; j < i; j++)
            {
                if (i % j == 0)
                {
                    isPrime = false;
                    break;
                }
            }
            if (isPrime) Console.WriteLine(i);
        }
    }
}

在计算素数的过程中,我们使用了两个线程来同时计算不同的范围内的素数,这样可以提高计算效率。

示例 2:下载文件

下面是一个下载文件的示例。假设我们需要从一个网站下载一个大文件,我们可以使用两个线程来分别下载前一半和后一半:

using System;
using System.Net;
using System.IO;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        Console.Write("请输入文件下载地址:");
        string url = Console.ReadLine();
        Uri uri = new Uri(url);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        long fileLength = response.ContentLength;
        Console.WriteLine("需要下载的文件大小为 " + fileLength + " 字节");
        FileStream fs = new FileStream("downloaded_file", FileMode.Create);
        fs.SetLength(fileLength);
        fs.Close();
        Thread thread1 = new Thread(new ParameterizedThreadStart(DownloadFilePart1));
        Thread thread2 = new Thread(new ParameterizedThreadStart(DownloadFilePart2));
        thread1.Start(uri);
        thread2.Start(uri);
        thread1.Join();
        thread2.Join();
        Console.WriteLine("下载完成");
        Console.Read();
    }

    static void DownloadFilePart1(object uri)
    {
        Uri uriObj = (Uri)uri;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriObj);
        request.AddRange(0, request.ContentLength / 2 - 1);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        FileStream fileStream = new FileStream("downloaded_file", FileMode.Open, FileAccess.Write, FileShare.Write);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            fileStream.Write(buffer, 0, bytesRead);
        }
        responseStream.Close();
        fileStream.Close();
    }

    static void DownloadFilePart2(object uri)
    {
        Uri uriObj = (Uri)uri;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriObj);
        request.AddRange(request.ContentLength / 2 + 1, request.ContentLength - 1);
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream responseStream = response.GetResponseStream();
        FileStream fileStream = new FileStream("downloaded_file", FileMode.Open, FileAccess.Write, FileShare.Write);
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            fileStream.Write(buffer, 0, bytesRead);
        }
        responseStream.Close();
        fileStream.Close();
    }
}

在下载文件的过程中,我们使用了两个线程来同时下载前一半和后一半的内容,这样可以提高下载速度。需要注意的是,在对文件进行操作时,我们需要使用 FileAccess.Write 和 FileShare.Write 来确保两个线程可以同时访问该文件,并且不会出现冲突。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c# Thread类线程常用操作详解 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 轻松学习C#的结构和类

    您好,如果想轻松学习C#的结构和类,可以按照以下步骤进行: 1.了解C#语言的基本结构和类的基础概念 首先可以从阅读一些相关的C#基础书籍或者网站文章开始,例如Microsoft官方的C#开发文档。 掌握C#语言关键字、语法和面向对象的基础特性,例如C#中type、class、struct、interface等的使用方法,以及属性、方法、字段、构造器等类的基…

    C# 2023年6月7日
    00
  • 分享两种实现Winform程序的多语言支持的多种解决方案

    接下来我将详细讲解Winform程序实现多语言支持的多种解决方案。 1. 利用Resx文件实现多语言支持 Resx文件是.NET中专门用于多语言支持的文件格式,可以用来存储不同语言的文本信息,在程序中通过读取Resx文件来实现不同语言的界面显示。 1.1 创建Resx文件 创建Resx文件有多种方式,这里以Visual Studio为例。 在Visual S…

    C# 2023年6月7日
    00
  • c# 类型的字段和方法设计建议

    下面来详细讲解 “c# 类型的字段和方法设计建议” 的完整攻略。 1. 建议在字段中使用自动属性 在定义类型的字段时,可以使用自动属性来简化代码。自动属性与传统的字段定义不同,后者需要定义字段和访问器方法(Getter/Setter),而自动属性可以在定义字段时直接定义 Getter 和 Setter 方法。举个例子: public class Person…

    C# 2023年6月1日
    00
  • C#中动态显示当前系统时间的实例方法

    下面我将为您详细讲解在C#中动态显示当前系统时间的实例方法的完整攻略。 步骤1:创建新的控制台应用程序 在Visual Studio中创建新的控制台应用程序,命名为“DynamicTime”。 步骤2:添加必要的命名空间 为了使用C#中的DateTime类,我们需要在程序中添加System命名空间。 using System; 步骤3:创建主方法 在Main…

    C# 2023年6月1日
    00
  • C#中ref关键字的用法

    当在C#中需要传递一个变量时,使用传值或传引用的方法。传值方式传递的是变量的值,而传递引用时传递的是变量的地址。ref关键字可以用来在函数调用中传递变量的地址,此时函数内对该变量的任何修改都会影响到调用者。 下面是ref关键字在C#中的用法示例: 1. 在函数中修改变量的值 假设我们有一个函数,要求增加输入值的值,可以使用ref关键字来传递变量,以便在函数中…

    C# 2023年5月31日
    00
  • ASP.NET性能优化小结(ASP.NET&C#)

    针对你提出的主题“ASP.NET性能优化小结(ASP.NET&C#)”,我将为你提供一些完整攻略,并附带两个示例,以供参考。 标题 1. 概述 对于一个高效的 ASP.NET 网站,性能优化至关重要。性能优化可以提高网站的访问速度、降低响应时间,缩短页面加载时间,减轻服务器的压力和消耗等。在本文中,我们将分享几个优化网站性能的策略。 2. 启用缓存(…

    C# 2023年5月15日
    00
  • C#多线程系列之读写锁

    C# 多线程系列之读写锁 什么是读写锁? 读写锁允许同时有多个线程来读取共享资源,但一次只允许一个线程来写入共享资源。这可能会带来一些好处,比如更快的数据访问速度。 读写锁的基本思想是: 如果它是一个读访问,它可以并发进行。 如果它是一个写入访问,则它需要独占式地进行。 读写锁的实现方式 ReaderWriterLock 在 .NET Framework 3…

    C# 2023年6月1日
    00
  • C#实现异步的常用方式总结

    让我来详细讲解一下“C#实现异步的常用方式总结”的完整攻略。 异步编程简介 在 C# 中,我们使用异步编程来执行长时间运行的操作,以便不会阻塞主线程。异步编程可以在不使用多线程的情况下实现并发性,并且能够改善应用程序的响应性能。 C# 实现异步的常用方式 C# 实现异步的常用方式主要有以下方式: 1.使用 Task 和 async/await Task 和 …

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部