在C#编程中,经常会遇到多线程处理并发的操作,举个简单例子,如果一个wpf程序,你在main函数中写了一个死循环,那么你的界面就会直接卡死动不了,这个时候就需要使用多线程或者异步操作来解决这个问题。
C#提供了多种方式来创建和管理线程,这篇文章简单介绍下其中4种方式。
1.使用Thread类
System.Threading.Thread
类是.NET框架中最基本的线程创建方式。通过实例化Thread
类并传递一个ThreadStart
委托或者ParameterizedThreadStart
委托(如果线程函数需要参数),可以启动一个新线程。
using System;
using System.Threading;
class Program
{
static void Main()
{
Thread threadJob = new Thread(DoJob);
threadJob .Start(); //线程启动
threadJob .Join(); // 等待线程完成
}
//启动线程后方法
static void DoJob()
{
Console.WriteLine("线程运行中...");
}
}
2.使用Task类(基于任务的异步模式)
从C# 4.0开始,引入了基于任务的异步模式(TAP),它使用System.Threading.Tasks.Task
类来表示异步操作。Task
类提供了更高级的抽象,允许更简洁的代码和更好的异常处理。
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Task task = Task.Run(() => DoWork());
task.Wait(); // 等待任务完成
}
static void DoWork()
{
Console.WriteLine("任务运行中...");
}
}
3.使用Task.Factory.StartNew方法
Task.Factory.StartNew
方法是另一种创建并启动任务的方式。与Task.Run
相比,它提供了更多的配置选项,如指定任务的调度器、创建子任务等。
using System;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Task task = Task.Factory.StartNew(() => DoWork());
task.Wait(); // 等待任务完成
}
static void DoWork()
{
Console.WriteLine("通过Task.Factory启动的任务运行中...");
}
}
4.使用异步方法
从C# 5.0开始,引入了async
和await
关键字,用于简化异步编程模型。这种方式不会直接创建新线程,而是在现有线程上进行异步操作,使得线程可以在等待I/O操作等耗时任务时不会被阻塞,提高了线程的利用率。
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main() // 注意Main方法也可以标记为async
{
await DoWorkAsync(); // 使用await关键字等待异步任务完成
}
static async Task DoWorkAsync()
{
Console.WriteLine("异步方法开始执行...");
await Task.Delay(1000); // 模拟耗时操作,如I/O请求等。
Console.WriteLine("异步方法执行完成...");
}
}
5.总结
以上四种方式各有优缺点,适用于不同的场景。Thread
类提供了对线程的底层控制,但使用起来相对繁琐;Task
类和Task.Factory.StartNew
方法提供了更高级的抽象和更好的性能;而async
/await
则进一步简化了异步编程模型,使得代码更易读和维护。在实际开发中,应根据具体需求选择合适的方式。