C# async await

目录

一.写法

二.用法


这里详细记录一下 async 和 await 的用法和注意点,当然前提是对 Task 比较了解了,因为 async 和 await 核心还是在 Task ,下面以实例来说明:

一.写法

先介绍一下写法,刚接触这两个关键字的时候,看别人写的代码总有些看不懂,后来发现原来是熟手们都喜欢简写,导致新手看不懂,如:

private static async Task<string> TestFunction()
{
	return await Task.Run(()=>"Test1");
}

完整的写法应是:

private static async Task<string> TestFunction()
{
    Task<string> task = new Task<string>(() =>
    {
        return "Test1";
    });
    task.Start();
    var result = await task;
    return result;
}

从完整的写法可以看出,await 等待的是 Task, 返回的是 Task Result 对应的具体类型值。

 

二.用法

下面以一些示例来说明具体用法和注意点:

1.示例,探究:只要是 async 方法里的操作,都不阻碍当前线程?

static void Main(string[] args)
{
    Console.WriteLine("Test Start");
    TestFunction();
    Console.WriteLine("Test End");
    Console.Read();
}

private static async Task<string> TestFunction()
{
    return await Task.Run(() =>
    {
        Thread.Sleep(2000);

        string result = "Test1";
        Console.WriteLine(result);
        return result;
    });
}

结果:

把 TestFunction 方法改成:

private static async Task<string> TestFunction()
{
    Thread.Sleep(2000);

    return await Task.Run(() =>
    {
        string result = "Test1";
        Console.WriteLine(result);
        return result;
    });
}

此时结果:

由此看出,Sleep 只有在 Task 或非主线程里,才不会阻碍当前UI线程,而不是只要放在 async 方法里就可以。

既然使用 Async Task,就不推荐使用 Sleep 了。一般使用 await Task.Delay, 既不影响当前主线程,也能达到延迟效果。

如:

private static async Task<string> TestFunction()
{
    await Task.Delay(5000);

    string result = "Test1";
    Console.WriteLine(result);
    return result;
}

结果:

2.示例,探究:在 async 方法中使用多个 await

static async Task Main(string[] args)
{
	await TestFunction();
	Console.Read();
}

private static async Task TestFunction()
{
	var task1Result = await TestFunction1();
	var task2Result = await TestFunction2();
	var result = $"{task1Result}+{task2Result}";

	await TestFunction3(result);
}

private static async Task<string> TestFunction1()
{
	await Task.Delay(2000);
	return "TestFunction1";
}

private static async Task<string> TestFunction2()
{
	await Task.Delay(3000);
	return "TestFunction2";
}

private static async Task TestFunction3(string str)
{
	await Task.Delay(1000);
	Console.WriteLine(str);
}

得到最后的结果共花了6秒:

更改 TestFunction 代码:

private static async Task TestFunction()
{
	Task<string> task1 = TestFunction1();
	Task<string> task2 = TestFunction2();
	var result = await Task.WhenAll(task1, task2);

	string output = string.Join("+", result);
	await TestFunction3(output);
}

这样得到最后结果只花 4 秒。

总结,

1.不是遇到 async 方法就会不阻碍当前线程(因为里面可以会有Thread.Sleep...);

2.await 会阻碍当前Async Task 里面的代码执行,但不会阻塞调用 async 方法的线程;

3.如果一个任务依赖多个子任务得出结果,子任务之间又不互相依赖,可以考虑使用 WhenAll 节约时间。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值