为什么要多线程,c#多线程编程有哪些实现方式,怎么中止线程

分类: 365bet如何提款 时间: 2025-07-11 13:25:15 作者: admin 阅读: 4491
为什么要多线程,c#多线程编程有哪些实现方式,怎么中止线程

using System;

using System.Threading;

class Program

{

static void ThreadMethod()

{

Console.WriteLine("子线程开始执行");

Thread.Sleep(2000); // 模拟耗时操作

Console.WriteLine("子线程执行结束");

}

static void Main()

{

Thread newThread = new Thread(ThreadMethod);

newThread.Start(); // 启动线程

Console.WriteLine("主线程继续执行");

newThread.Join(); // 等待子线程执行完毕

Console.WriteLine("主线程执行结束");

}

}

在上述代码中,首先定义了一个 ThreadMethod 方法,该方法将在子线程中执行。然后创建了一个 Thread 对象,并将 ThreadMethod 作为参数传递给它,最后调用 Start 方法启动线程。

ParameterizedThreadStart 委托允许你创建一个可以接受单个对象类型参数的线程方法。下面是具体的示

using System;

using System.Threading;

class Program

{

// 定义一个可以接受单个对象参数的方法

static void ThreadMethod(object obj)

{

if (obj is string message)

{

Console.WriteLine($"线程接收到的消息: {message}");

}

}

static void Main()

{

string data = "这是传递给线程的参数";

// 创建一个 ParameterizedThreadStart 委托实例,指向 ThreadMethod 方法

ParameterizedThreadStart start = new ParameterizedThreadStart(ThreadMethod);

// 创建一个新的线程,并将委托实例传递给它

Thread thread = new Thread(start);

// 启动线程,并传递参数

thread.Start(data);

// 等待线程执行完成

thread.Join();

Console.WriteLine("主线程继续执行");

}

}

2. 使用线程池(ThreadPool)

线程池可以管理和复用线程,减少线程创建和销毁的开销,提高性能。

using System;

using System.Threading;

class Program

{

static void ThreadPoolCallback(object state)

{

Console.WriteLine("线程池线程开始执行");

Thread.Sleep(2000); // 模拟耗时操作

Console.WriteLine("线程池线程执行结束");

}

static void Main()

{

ThreadPool.QueueUserWorkItem(ThreadPoolCallback);

Console.WriteLine("主线程继续执行");

Thread.Sleep(3000); // 等待线程池线程执行完毕

Console.WriteLine("主线程执行结束");

}

}

这里使用 ThreadPool.QueueUserWorkItem 方法将一个工作项(即 ThreadPoolCallback 方法)加入到线程池的工作队列中,线程池会自动分配一个线程来执行该工作项。

3. 使用 Task 类

Task 类是 .NET 4.0 引入的用于异步编程的高级抽象,它基于线程池实现,提供了更简洁和强大的异步编程模型。

using System;

using System.Threading.Tasks;

class Program

{

static async Task Main()

{

Task task = Task.Run(() =>

{

Console.WriteLine("任务开始执行");

Thread.Sleep(2000); // 模拟耗时操作

Console.WriteLine("任务执行结束");

});

Console.WriteLine("主线程继续执行");

await task; // 等待任务执行完毕

Console.WriteLine("主线程执行结束");

}

}

通过 Task.Run 方法可以创建并启动一个新的任务,该任务会在后台线程中执行。使用 await 关键字可以异步等待任务完成。

4. 使用 async/await 关键字

async/await 是 C# 中用于简化异步编程的语法糖,它建立在 Task 的基础之上。

using System;

using System.Threading.Tasks;

class Program

{

static async Task Main()

{

await DoWorkAsync();

Console.WriteLine("主线程执行结束");

}

static async Task DoWorkAsync()

{

Console.WriteLine("异步方法开始执行");

await Task.Delay(2000); // 模拟耗时操作

Console.WriteLine("异步方法执行结束");

}

}

中止 C# 线程的方法

1. 使用标志位

通过定义一个布尔类型的标志位,在子线程中定期检查该标志位的值,当标志位为 true 时,线程自行退出

using System;

using System.Threading;

class Program

{

private static volatile bool isStopped = false;

static void ThreadMethod()

{

while (!isStopped)

{

Console.WriteLine("子线程正在执行");

Thread.Sleep(1000);

}

Console.WriteLine("子线程已停止");

}

static void Main()

{

Thread newThread = new Thread(ThreadMethod);

newThread.Start();

Thread.Sleep(3000); // 主线程等待一段时间

isStopped = true; // 设置标志位为 true,通知子线程停止

newThread.Join(); // 等待子线程退出

Console.WriteLine("主线程执行结束");

}

}

这里使用 volatile 关键字确保 isStopped 变量在多线程环境下的可见性。

2. 使用 CancellationToken(适用于 Task)

CancellationToken 是一种用于取消异步操作的机制,通常与 Task 结合使用。

using System;

using System.Threading;

using System.Threading.Tasks;

class Program

{

static async Task Main()

{

CancellationTokenSource cts = new CancellationTokenSource();

Task task = DoWorkAsync(cts.Token);

await Task.Delay(3000); // 主线程等待一段时间

cts.Cancel(); // 取消任务

try

{

await task;

}

catch (OperationCanceledException)

{

Console.WriteLine("任务已取消");

}

Console.WriteLine("主线程执行结束");

}

static async Task DoWorkAsync(CancellationToken token)

{

while (!token.IsCancellationRequested)

{

Console.WriteLine("任务正在执行");

await Task.Delay(1000, token);

}

token.ThrowIfCancellationRequested();

}

}

在上述代码中,CancellationTokenSource 用于创建一个 CancellationToken,并通过 Cancel 方法请求取消任务。在 DoWorkAsync 方法中,定期检查 token.IsCancellationRequested 的值,当收到取消请求时,任务会抛出 OperationCanceledException 异常。

相关文章

打鼓新场和鲁班场为什么一个不打一个要打?·漫话四渡赤水(补遗)
在家自制羽毛笔的制作方法教程
DNF解读拍卖行强力的传说武器:鬼剑士篇