5.1C#异步编程运行机制

C#语言的异步编程是基于任务的异步编程(Task Asynchronous Programming,简写TAP)模型,该模型的核心是 Task 和 Task<T> 对象以及 async 和 await 关键字。

异步方法声明

async 返回类型 CurrentMethodAsync() {
    //启动多个任务,并将结果存储在任务
    返回类型1 任务1 = AnotherMethod1Async();
    返回类型2 任务2 = AnotherMethod2Async();
    返回类型N 任务N = AnotherMethodNAsync();

    //挂起当前异步方法,当任务有结果时,从任务查询结果
    类型1 变量1 = await 任务1;
    类型2 变量2 = await 任务2;
    类型N 变量N = await 任务N;

    [return 表达式;]
}

async 修饰符声明这是异步方法。

await 运算符等待另一个异步方法返回的任务。仅允许在异步方法中且至少使用一个 await 运算符。

await 运算符会立即暂停往下执行同时将当前异步方法挂起,并且控制返回到当前异步方法的调用方,当 任务 有结果时,控制将在此处继续,从 任务 查询结果并赋值给变量。

通过这两个关键字,可以轻松地创建异步方法(几乎与创建同步方法一样轻松)。

返回类型

返回类型类型描述
Task引用类型如果方法内 return 语句不返回操作数 或 不含任何 return 语句,则将 Task 用作返回类型。
Task<TResult>引用类型如果方法内 return 语句的操作数返回类型为 TResult 类型,则将 Task<TResult> 用作返回类型。
void值类型如果要编写需要 void 返回类型的异步事件处理程序(async event handler)。
ValueTask 值类型 Task 的值类型
ValueTask<TResult>值类型Task<TResult> 的值类型
IAsyncEnumerable<T>引用类型 返回异步流的异步方法

等待任务

用这个而不是这个应用场景
awaitTask.Wait 或 Task.Result检索后台任务的结果
await Task.WhenAnyTask.WaitAny等待任何任务完成
await Task.WhenAllTask.WaitAll等待所有任务完成
await Task.DelayThread.Sleep等待一段时间

运行机制

public async Task<int> GetUrlContentLengthAsync()
{
    var client = new HttpClient();

    Task<string> getStringTask =
        client.GetStringAsync("https://docs.microsoft.com/dotnet");

    DoIndependentWork();

    string contents = await getStringTask;

    return contents.Length;
}

void DoIndependentWork()
{
    Console.WriteLine("Working...");
}
.1C#异步编程运行机制"/

运行机制基本分为两步:

1.启动 Task<string>任务

Task<string> getStringTask =
        client.GetStringAsync("https://docs.microsoft.com/dotnet");

2.等待 Task<string>任务

string contents = await getStringTask;

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/11607.html

发表评论

登录后才能评论