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#利用Random得随机数求均值、方差、正态分布的方法

    生成指定数量的随机数 首先需要生成指定数量的随机数,C#中使用Random类可以很方便地实现这个功能。下面是一个生成100个随机数的示例代码: int n = 100; double[] nums = new double[n]; Random rand = new Random(); for (int i = 0; i < n; i++) { num…

    C# 2023年6月7日
    00
  • asp.net 需要登陆的网站上下载网页源代码和文件

    要下载需要登陆的网站的源代码和文件,我们可以使用以下步骤: 安装浏览器扩展程序 我们可以搜索并安装一些浏览器扩展程序,如“EditThisCookie”或“Get Cookies”,这些扩展程序可以帮助我们获取网站的cookie信息,用以模拟登陆状态。 登陆并获取cookie信息 使用浏览器登陆需要下载的网站,进入登陆状态后,打开扩展程序,获取cookie信…

    C# 2023年5月31日
    00
  • C#监控文件夹变化的方法

    下面我将为你详细讲解“C#监控文件夹变化的方法”的完整攻略。 1. 使用FileSystemWatcher类 在C#中,我们可以使用FileSystemWatcher类来监听特定文件夹的变化。使用方法如下: // 实例化一个FileSystemWatcher对象 FileSystemWatcher watcher = new FileSystemWatche…

    C# 2023年6月1日
    00
  • c#中list.FindAll与for循环的性能对比总结

    我来为你详细讲解“c#中list.FindAll与for循环的性能对比总结”的完整攻略。 1. 介绍 在 C# 中,List 是常用的集合类之一,其中经常使用的一个方法是 FindAll,它可以根据给定的条件筛选 List 中的元素。然而,FindAll 并非是唯一的解决方案,我们也可以采用 for 循环来实现相似的功能。在本文中,我们将讨论 FindAll…

    C# 2023年6月3日
    00
  • C# File.ReadAllLines – 读取文件的所有行

    File.ReadAllLines 方法是C#中用来读取文本文件所有行的方法。该方法返回一个字符串数组,其中每个元素都是文件中每行文本的一个字符串。 使用方法如下: string[] lines = File.ReadAllLines("file.txt"); 上述代码读取名为“file.txt”的文本文件中的所有行,并将它们存储在一个字…

    C# 2023年4月19日
    00
  • C#构造函数在基类和父类中的执行顺序

    C#中的构造函数是用来初始化类中的成员变量的特殊方法。在类继承中,派生类会继承基类的构造函数,同时也可以自定义自己的构造函数。 构造函数在派生类的实例化过程中,会按照一定的规则执行基类和派生类中的构造函数,其执行顺序如下: 先执行基类的构造函数。 继续执行派生类的构造函数。 这个顺序是由 C# 引入的可靠构造函数(Reliable Constructor)原…

    C# 2023年6月7日
    00
  • 磊科路由器初始密码是多少?磊科路由器默认密码大全

    磊科路由器是一种常见的家用路由器,它提供了安全的网络连接和管理功能。在使用磊科路由器时,您需要知道初始密码或默认密码。本攻略将深入探讨磊科路由器初始密码和默认密码,并提供两个示例说明。 磊科路由器初始密码 磊科路由器的初始密码是指在第一次使用路由器时,您需要输入的密码。磊科路由器的初始密码通常是“admin”。如果您已经更改了密码,那么初始密码将不再有效。 …

    C# 2023年5月17日
    00
  • C#中efcore-ShardingCore呈现“完美”分表

    我会详细讲解“C#中efcore-ShardingCore呈现‘完美’分表”的完整攻略,并包含两条示例说明。 ShardingCore 什么是ShardingCore? ShardingCore是一个基于EF Core的分表库,它提供了完美的分表功能,欢迎大家去GitHub上了解更多信息。 ShardingCore分表的实现方式 ShardingCore实现…

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