async await
专门用于处理一些文件IO(潜规则)
网络IO和文件IO都有一些异步方法,MemoryStream ,FileStream ,WebRequest
Task是用于最大限度使用WorkThread
优点:
异步代码简洁
提升开发效率
状态机StateMachine
用于处理IO消耗的多线程
static void Main(string[] args)
{
var info = Hello().Result;
Console.WriteLine(info);
Console.Read();
}
static async Task<string> Hello()
{
//主线程执行,底层还会调用一个 AwaitUnsafeOnCompleted 委托给线程池
Console.WriteLine("hello world");
//在工作线程中执行
var x = await Task.Run(() =>
{
Console.WriteLine("i'm middle");
return "i'm ok";
});
Console.WriteLine("我是结尾哦:{0}", x);
return x;
}
- AsyncTaskMethodBuilder: 扮演了一个TaskcomplationSource一个角色,就是做Task的包装器。
- state:扮演者状态机状态的角色,记录当前状态
- AwaitUnsafeOnCompleted :这个函数是丢给线程池去执行的,当某一时刻执行结束,会调用Movenext
class Program
{
static void Main(string[] args)
{
var info = Hello();
Console.WriteLine("我去: " + info.Result);
Console.Read();
}
static Task<string> Hello()
{
MyStateMachine machine = new MyStateMachine();
//类似TaskCompletionSource,包装器
machine.t_builder = AsyncTaskMethodBuilder<string>.Create();
machine.state = -1;
var t_builder = machine.t_builder;
t_builder.Start(ref machine);
return machine.t_builder.Task;
}
}
public class MyStateMachine : IAsyncStateMachine
{
public AsyncTaskMethodBuilder<string> t_builder;
public int state;
private MyStateMachine machine = null;
private TaskAwaiter<string> myawaiter;
string result = string.Empty;
public MyStateMachine()
{
}
public void MoveNext()
{
try
{
switch (state)
{
case -1:
Console.WriteLine("hello world");
var waiter = Task.Run(() =>
{
Console.WriteLine("i'm middle");
return "i'm ok";
}).GetAwaiter();
state = 0; //设置下一个状态
myawaiter = waiter;
machine = this;
//丢给线程池执行了。。。
t_builder.AwaitUnsafeOnCompleted(ref waiter, ref machine);
break;
case 0:
var j = myawaiter.GetResult();
Console.WriteLine("我是结尾哦:{0}", j);
t_builder.SetResult(j);
break;
}
}
catch (Exception ex)
{
t_builder.SetException(ex); //设置t_builder的异常
}
}
public void SetStateMachine(IAsyncStateMachine stateMachine)
{
}
}
异步执行IO操作

线程池将Task交给驱动程序的队列,立即返回。
等文件系统操作完成后,通知CLR,CLR使用IO线程通知应用程序(调用回调函数)
同步阻塞执行IO操作


?GetAwaiter?

浙公网安备 33010602011771号