上图的所有多线程案例大全完整版本项目源代码下载---->点击下载
在C#中,Task
是一个用于表示异步操作的类,它可以帮助我们更轻松地管理线程和异步操作。然而,有时我们可能需要在Task
上等待一个操作完成后再继续执行。
private void button13_Click(object sender, EventArgs e)
{
Task task = new Task(() =>
{
Thread.Sleep(100);
Console.WriteLine("执行Task结束!");
});
//同步执行,task会阻塞主线程
task.RunSynchronously();
Console.WriteLine("执行主线程结束!");
}
private void button14_Click(object sender, EventArgs e)
{
//Task的Wait/WaitAny/WaitAll方法
//Thread的Join方法可以阻塞调用线程,但是有一些弊端:①如果我们要实现很多线程的阻塞时,每个线程都要调用一次Join方法
Task task1 = Task.Run(() =>
{
Thread.Sleep(1000);
Console.WriteLine($"hello, task1的线程ID为{ Thread.CurrentThread.ManagedThreadId}");
});
Task task2 = Task.Run(() =>
{
Thread.Sleep(2000);
Console.WriteLine($"hello, task2的线程ID为{ Thread.CurrentThread.ManagedThreadId}");
});
//task1.Wait();
//Console.WriteLine($"hello, task1结束");
//task2.Wait();
//Console.WriteLine($"hello, task2结束");
Task.WaitAny(new Task[] { task1, task2 }); //表示只要有一个task执行完毕就解除阻塞
Console.WriteLine($"hello, 任意其中一个线程结束");
Task.WaitAll(new Task[] { task1, task2 });
Console.WriteLine($"hello, 所有线束结束");
}