异步
关于异步
一个是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。逻辑也是接着往下走,但是异步接着运行的。