Thread
- Thread为C#提供的基础线程类,初始化函数为public Thread(ThreadStart start),其中ThreadStart为委托类型,在实际使用过程中,通常通过Lambda函数实现。
- `namespace demo02
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始测试");
Console.WriteLine("主线程休眠3秒");
threadFunc();
Thread.Sleep(3000);
Console.WriteLine("主线程休眠结束");
}
static void threadFunc() {
Thread t = new Thread(()=>
{
Console.WriteLine("Thread线程函数开始运行");
Thread.Sleep(2000);
Console.WriteLine("Thread线程函数运行结束,用时2秒");
}
);
t.Start();
}
}
}
Task(推荐)
- 在多线程开发过程中,推荐使用Task类型;
- Task底层通过Thread实现,但是Task在Thread的基础上,提供了线程管理功能,如线程池,并且在处理高并发问题时的性能更好;
namespace demo02
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始测试");
Console.WriteLine("主线程休眠3秒");
taskFunc();
Thread.Sleep(3000);
Console.WriteLine("主线程休眠结束");
}
static void taskFunc() {
Task.Run(() =>
{
Console.WriteLine("Task线程1开始运行");
Thread.Sleep(2000);
Console.WriteLine("Task线程1运行结束,用时2秒");
});
Task.Run(() =>
{
Console.WriteLine("Task线程2开始运行");
Thread.Sleep(2000);
Console.WriteLine("Task线程2运行结束,用时2秒");
});
}
}
}
Async异步方法
- 通过将函数标注为异步方法,并未Task线程添加await标签,可以确保该线程执行完毕后,再执行后续代码。
namespace demo02
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始测试");
Console.WriteLine("主线程休眠3秒");
asyncTaskFunc();
Thread.Sleep(3000);
Console.WriteLine("主线程休眠结束");
}
static async void asyncTaskFunc() {
await Task.Run(() =>
{
Console.WriteLine("Task线程开始运行");
Thread.Sleep(2000);
Console.WriteLine("Task线程运行结束,用时2秒");
});
Console.WriteLine("AsyncTaskFunc函数运行完毕");
}
}
}
线程池
- 通过将Task对象添加入List<Task>队列,可对队列中的线程进行统一管理。
namespace demo02
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始测试");
Console.WriteLine("主线程休眠3秒");
listAsyncTaskFunc();
Thread.Sleep(3000);
Console.WriteLine("主线程休眠结束");
}
static void listAsyncTaskFunc() {
List<Task> ts = new List<Task>();
ts.Add(Task.Run(() =>
{
Console.WriteLine("Task线程1开始运行");
Thread.Sleep(2000);
Console.WriteLine("Task线程1运行结束,用时2秒");
}));
ts.Add(Task.Run(() =>
{
Console.WriteLine("Task线程2开始运行");
Thread.Sleep(2000);
Console.WriteLine("Task线程2运行结束,用时2秒");
}));
Task.WhenAll(ts).ContinueWith(t =>
{
Console.WriteLine("异步线程列表已运行结束");
});
}
}
}