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

yizhihongxing

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#中的依赖注入和IoC容器

    详解C#中的依赖注入和IoC容器 什么是依赖注入 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少代码间的耦合关系。在依赖注入中,对象依赖不会被硬编码进对象中,而是由外部的实体注入依赖关系。 在实际开发中,依赖通常指的是对象和组件需要的其他对象或组件。依赖注入可以让代码的设计更加灵活,易于维护和扩展。 IoC容器 在依赖…

    C# 2023年5月31日
    00
  • UnityShader使用图像叠加实现运动模糊

    下面是详细讲解”Unity Shader使用图像叠加实现运动模糊”的攻略。 一、前言 在实现游戏视觉效果时,运动模糊是一种非常实用的手段。运动模糊使用了相邻的帧并取平均值以模拟运动物体的模糊效果,使动作看起来更加连续、自然。 二、实现思路 运动模糊的实现思路是将相邻的帧的图像进行叠加处理,最后再进行取平均。具体实现时,需要使用相机的 RenderTextur…

    C# 2023年6月3日
    00
  • C#调用EXE文件实现传参和获取返回结果

    首先,我们需要知道C#调用EXE文件实现传参和获取返回结果的基本流程。具体流程如下: 1.使用Process类启动外部EXE程序。 2.在ProcessStartInfo对象中设置使用的外部程序、参数和重定向标准输入输出等配置。 3.使用Process类的StandardInput属性向外部程序写入数据。 4.使用Process类的StandardOutpu…

    C# 2023年5月15日
    00
  • 深入理解MVC中的时间js格式化

    关于“深入理解MVC中的时间js格式化”的完整攻略,我将以下面的方式进行详细说明: 1. 什么是MVC 首先,我们需要了解MVC模式的基本概念。MVC代表Model-View-Controller(模型-视图-控制器),是一种设计模式,一种将应用程序的逻辑分离成三个主要部分的方式。这三个部分之间的交互是根据一组规则进行的。 Model:代表应用程序的数据和业…

    C# 2023年5月31日
    00
  • C#和vb.net实现PDF 添加可视化和不可见数字签名

    C# 和 VB.net 都可以使用 iTextSharp 库来实现 PDF 文件添加数字签名。数字签名可以是可视化的,也可以是不可见的。 以下是实现 PDF 添加数字签名的完整攻略: 步骤 1:引入 iTextSharp 库 在项目中引入 iTextSharp 库。通常会从 NuGet 软件包管理器中安装该库,或者从官方网站 https://github.c…

    C# 2023年5月31日
    00
  • ASP.NET Core中的通用主机HostBuilder

    ASP.NET Core中的通用主机HostBuilder是一种用于构建和配置应用程序主机的通用机制。HostBuilder提供了一种简单的方式来配置应用程序的服务、配置和日志记录等方面。下面是ASP.NET Core中的通用主机HostBuilder的完整攻略。 什么是HostBuilder? 在ASP.NET Core中,HostBuilder是一种用于…

    C# 2023年5月16日
    00
  • C#实现学生档案查询

    C#实现学生档案查询攻略 简介 本篇攻略将为大家介绍如何使用C#语言实现学生档案查询功能。学生档案查询主要包括查询功能和显示结果功能。查询功能可根据学生姓名、学号等关键词进行查询,显示结果功能则可将查询到的数据在页面上进行展示。接下来,我们将介绍实现此功能的具体步骤。 步骤 1. 新建工程 首先,在Visual Studio中创建一个新的控制台应用程序工程。…

    C# 2023年6月2日
    00
  • ASP.NET Core利用Jaeger实现分布式追踪详解

    在本攻略中,我们将详细讲解如何在ASP.NET Core中利用Jaeger实现分布式追踪,并提供两个示例说明。 安装Jaeger:首先,我们需要安装Jaeger。我们可以从官方网站下载Jaeger,并按照官方文档进行安装和配置。 安装Jaeger.Client:接下来,我们需要安装Jaeger.Client NuGet包。我们可以使用Visual Studi…

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