直接上Code比较直观(稍作说明):
1:自定义Awaiterpublic class DemoAwaiter : INotifyCompletion
{ public bool IsCompleted
{
get
{
return true;
}
} public void OnCompleted(Action continuation)
{
continuation();
} public int GetResult()
{
return 1;
}
}
2:扩展实现对象public static class AsyncExtensions
{
public static TaskAwaiter GetAwaiter(this int d)
{
return Task.Delay(d).GetAwaiter();
} public static DemoAwaiter GetAwaiter(this DateTime time)
{
return new DemoAwaiter();
}
}
3:结果对比
public static async Task GetTaskInt()
{
DateTime time = DateTime.Now;
await time;
Console.WriteLine(123);
} public static async Task GetTaskTime()
{
DateTime time = DateTime.Now;
await time;
Console.WriteLine(123);
}3.1:运行 GetTaskInt(); 先输出 "i am continue job" ,然后输入 "123" (预期正常异步结果)
3.2:运行 GetTaskTime() 先输入"123",然后输入 "i am continue job" (这里就是问题,感觉没有异步执行??)请大家看下为什么?
本人推测:会不会是task.Delay 新开启了一个线程哪?
1:自定义Awaiterpublic class DemoAwaiter : INotifyCompletion
{ public bool IsCompleted
{
get
{
return true;
}
} public void OnCompleted(Action continuation)
{
continuation();
} public int GetResult()
{
return 1;
}
}
2:扩展实现对象public static class AsyncExtensions
{
public static TaskAwaiter GetAwaiter(this int d)
{
return Task.Delay(d).GetAwaiter();
} public static DemoAwaiter GetAwaiter(this DateTime time)
{
return new DemoAwaiter();
}
}
3:结果对比
public static async Task GetTaskInt()
{
DateTime time = DateTime.Now;
await time;
Console.WriteLine(123);
} public static async Task GetTaskTime()
{
DateTime time = DateTime.Now;
await time;
Console.WriteLine(123);
}3.1:运行 GetTaskInt(); 先输出 "i am continue job" ,然后输入 "123" (预期正常异步结果)
3.2:运行 GetTaskTime() 先输入"123",然后输入 "i am continue job" (这里就是问题,感觉没有异步执行??)请大家看下为什么?
本人推测:会不会是task.Delay 新开启了一个线程哪?
public class Class1
{
public static async Task GetTaskInt()
{
await 1000;
Console.WriteLine(123);
} public static async Task GetTaskTime()
{
DateTime time = DateTime.Now;
await time;
Console.WriteLine(123);
} public static void Main()
{
GetTaskTime();
Console.WriteLine("i am continue job");
GetTaskInt();
Console.WriteLine("i am continue job");
Console.Read();
}
}
{
return Task.Delay(time - DateTime.Now).GetAwaiter();
}
应该是这样写:
await Task.Delay(1000);
await 关键字必须紧跟返回Task或Task<T>类型的方法后面,你直接跟一个数字或一个日期,居然不报错?而且这和你1、2两段代码完全无关了。
GetAwaiter 返回TaskAwaiter可以修改await。可以执行。
就是为了想自己实现一让某个对象支持 await 操作,并且使用自定义的Awaiter(此处定义的DateTime只是为了偷懒随便找来一个对象来验证自定义的Awaiter即DemoAwaiter)。
问题:
但是结果却发现我自己写的代码跟使用.net 提供的TaskAwaiter所实现的代码执行顺利不一样....
感觉我自己实现的代码就是同步在执行,而使用.net 提供的则是异步在执行,所以问题就来了,这是为什么那??
那根据楼上所说 Task.Delay 是多线程的操作.那么根据我自己对.net 4.5 async 的理解,await 后边的的东西应该有编译器自己创建了一个状态机去做工作的。这个应该跟多线程没关系吧?请指教.