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技术站