关于异步

一个是i/o绑定 类似于下载之类的,一般会提供方法,只需要在前面添加await

一个是大量cpu计算的,await +一个task.run

  • 在调用异步方法的时候,就已经执行了
  • 异步方法要加async,取名字最好后面加一个Async
  • 方法的返回类型有以下几个
void 调用异步方法后就不管了
Task 调用后不需要吐出来什么,但是可以查看状态
Task 调用后可以查看他的状态,还可以看返回值
ValueTask 基本和上面差不多,但是因为是值类型,所以默写情况下可以提高性能

Tsak.Run()

我们程序员自己可以写的异步,主要有以下中方法,大类分为4个

异常

异步可以在try-catch 中。

  • 即使出错,task的状态也是完成的,因为1.没有取消这个task 2.错误被处理了
  • catch 和finally中也可以用await,比如写日志
static void Main(string[] args)
{
    Task t = BadAsync();
    t.Wait();
    Console.WriteLine($"{t.Status}");
    Console.WriteLine($"{t.IsFaulted}");
}

static async Task BadAsync()
{
    try
    {
        await Task.Run(() => { throw new Exception(); });
    }
    catch
    {
        Console.WriteLine("有问题");
    }
}
====
有问题
RanToCompletion
False

等待

方法 说明 实例
Wait() 同步等待结束 x.Wait()
WaitAll() 等待所有的结束-静态 Task.WaitAll()
WaitAny() 等待其中一个结束就ok-静态 Task.WaitAny()

Wait()

void Wait() 等待 Task 完成执行过程。
bool Wait(TimeSpan) 等待 Task 在指定的时间间隔内完成执行。
bool Wait(Int32) 等待 Task 在指定的毫秒数内完成执行。
bool Wait(Int32, CancellationToken) 等待 Task 完成执行过程。 如果在任务完成之前超时间隔结束或取消标记已取消,等待将终止。
void Wait(CancellationToken) 等待 Task 完成执行过程。 如果在任务完成之前取消标记已取消,等待将终止。

需要注意的是,凡是入参有一个指定时间,返回值是bool 类型的。

这种情况下,主系统等待到规定时间后,会返回一个false,并且往下走,但是异步里面的任务还是会接着运行的,直到结束

WaitAll()和WaitAny()

前者暂停等待所有异步的都好了,再继续往下走

后者只要其中一个完成了,就往下走,但是其余未完成的异步还在执行的

同理,这两个方法入参有事件相关的,返回类型也是bool。逻辑也是接着往下走,但是异步接着运行的。