我一直认为C#的异步方法只是一堆华而不实的东西,坑特别多,比起直接自建线程也没有任何优势。
直到有一天,一个需求场景,让我再次想到了C#的异步方法。
需求场景如下:需要写一个程序控制机械臂完成各种动作。每个动作要同时控制多个关节,而关节的运动需要时间。整套流程需要紧密衔接,一个关节执行完成后另外几个关节才可以运动,一个动作要等待多个关节全部完成它自己的动作。经过思考,我最终还是选择了那个让我之前栽了大跟头的异步方法。
原因嘛,很简单:如果采用老办法直接新建线程,那意味着每执行一个关节都要建立一个线程,最终要管理无数个乱七八糟的线程。不如使用异步方法,让C#自己建立新线程自己管理,我们只需要在代码中指示不同关节任务之间的衔接方式即可。
public static void Main()
{
// 开展执行某动作 需要运动两个关节
Task t1 = Run1();
Task t2 = Run2();
Task.WaitAll(t1, t2);
Console.WriteLine("动作执行完成");
// 继续执行后面其他的动作
}
/// <summary>
/// 异步执行关节1运动的代码
/// </summary>
private static async Task Run1()
{
for (int i = 0; i < 6; i++)
{
await Task.Delay(1000);
Console.WriteLine(i);
}
Console.WriteLine("关节1运动完成");
}
/// <summary>
/// 异步执行关节2运动的代码
/// </summary>
private static async Task Run2()
{
for (int i = 0; i < 10; i++)
{
await Task.Delay(1000);
Console.WriteLine(i);
}
Console.WriteLine("关节2运动完成");
}