using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AwaitAsync
{
class Program
{
static void Main(string[] args)
{
AwaitAsync awaitObj = new AwaitAsync();
//await和async成对出现
//await 必须出现在asyn修饰的方法中 修饰async方法或者task
//framework4.5以上
//await/async是语法糖,由编译器提供
//主线程遇到await返回执行自己的动作,await之后的动作等待await完成后执行,相当于await这个task的回调
//多个await可以以同步的方式编写代码,但却不是阻塞的,相当于回调多次
//async编译后会生成一个状态机(实现IAsyncStateMachine接口)
//状态机:初始化0--执行变为1---在执行变为0--循环---出现其他状态终止
//async的逻辑:主线程执行--此时状态机状态为-1--执行await之前的部分,并修改状态机为0---返回
// 子线程执行--修改状态为0--等待task任务完成--执行await之后的代码
awaitObj.AwaitTest();
Console.ReadKey();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AwaitAsync
{
public class AwaitAsync
{
public void AwaitTest()
{
Console.WriteLine($"**AwaitTest Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
//await Test();//其实async修饰方法默认返回一个task,await其实就是修饰task
//AwaitNoReturn();
//CallBack();
//Test1();
//{
// Task<int> task = AwaitReturnInt();
// Console.WriteLine($"result = {task.Result}");
//}
{
Task<int> task = TaskReturnInt();
Console.WriteLine($"result = {task.Result}");
}
Console.WriteLine($"**AwaitTest End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
//只有async没有await会报警告,和普通方法没区别
public async Task Test()
{
Console.WriteLine($"Test Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Console.WriteLine($"Test End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
//await和Task Wait的区别
public async Task Test1()
{
Task task = AwaitReturnTask();
task.Wait();//主线程等待task完成,执行之后的代码,阻塞主线程
await task;//主线程返回,task执行完成,task之后的代码相当于回调,不阻塞
Console.WriteLine($"这部分代码Wait()会阻塞 await却不会");
}
private async void AwaitNoReturn()
{
Console.WriteLine($"AwaitNoReturn Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
//await修饰task
//遇到await主线程返回,剩余动作等待await执行完成
await Task.Run(() =>
{
Console.WriteLine($"Task {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
//这个是剩余动作 等待await完成 相当于task的回调
Console.WriteLine($"AwaitNoReturn End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
//async修饰方法 虽然没有return 但默认返回Task
private async Task AwaitReturnTask()
{
Console.WriteLine($"AwaitNoReturn Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
//await修饰task
//遇到await主线程返回,剩余动作等待await执行完成
await Task.Run(() =>
{
Console.WriteLine($"Task {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
});
//这个是剩余动作 等待await完成 相当于task的回调
Console.WriteLine($"AwaitNoReturn End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}
//相当于await
private void CallBack()
{
Console.WriteLine($"AwaitNoReturn Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Task.Run(() =>
{
Console.WriteLine($"Task {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
}).ContinueWith(t => Console.WriteLine($"AwaitNoReturn End {Thread.CurrentThread.ManagedThreadId.ToString("00")}"));
}
//带返回值的await 应用之一 保证子线程对返回值的操作完成
//async 修饰的,可以返回是个int
private async Task<int> AwaitReturnInt()
{
Console.WriteLine($"AwaitReturnInt Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
int rst = 0;
await Task.Run(() =>
{
for (int i = 0; i < 10000; i++)
{
rst++;
}
Thread.Sleep(5000);
});
//这个是剩余动作 等待await完成 相当于task的回调
Console.WriteLine($"AwaitReturnInt End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
return rst;
}
//对应的类似方法,不过主线程还是会阻塞
//没有async修饰的 必须返回时task
private Task<int> TaskReturnInt()
{
Console.WriteLine($"TaskReturnInt Start {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
int rst = 0;
Task<int> task = Task.Run<int>(() =>
{
for (int i = 0; i < 10000; i++)
{
rst++;
}
Thread.Sleep(5000);
return rst;
});
//这个主线程循序执行了,并不会像await一样被回调
Console.WriteLine($"TaskReturnInt End {Thread.CurrentThread.ManagedThreadId.ToString("00")}");
return task;
}
}
}