async标记的是异步方法,不是很理解。
await标记会挂起。
//有这样一个异步方法 Public async Task<int> Func1() { System.Threading.Thread.Sleep(5000); return 1; } //调用1 Task<int> t = Func1(); await t; //结果: //执行会阻塞,await没有挂起。 //调用2 Task<int> t = new Task<int>(() => { System.Threading.Thread.Sleep(5000); return 1; }); t.Start(); await t; //结果: //不会阻塞 //疑惑: //上面调用1和调用2中的t都是Task,都使用的 await Task的语法,为什么调用1会阻塞,没有起到异步的作用,而调用2可以。
还有写一个异步的方法应该怎么写呢
其实吧,这些在 MSDN 上介绍 async、await 关键字时就已经给出例子说明了。
Public async Task<int> Func1()
{
System.Threading.Thread.Sleep(5000); // 这会阻塞调用线程,负责执行 Func1 方法的线程会阻塞 5000 毫秒。
return 1;
}
改成这样:
Public async Task<int> Func1()
{
await Task.Delay(5000); // 当前被执行的方法(Func1)会被挂起 5000 毫秒,负责执行 Fun1 方法的线程可以被用于执行其它代码。
return 1;
}
我就是不知道为什么会这样的。
比如
// await Task //如果这个Task是一个异步方法返回的,如下,他就会阻塞 Public async Task<int> Func() { //方法中没有用到 await关键字 } //如果这个Task是New Task出来的, 就不会阻塞 Task<int> t = new Task<int>(() => { //方法中也可以不用 await关键字 } //注意 上面2个Task的执行的内容是相同的,只是生成Task的方式不一样。 //为什么会这样呢?
@★luan:
Public async Task<int> Func()
{
System.Threading.Thread.Sleep(5000);
return 1;
}
此方法可以展开,展开后的代码如下:
System.Threading.Thread.Sleep(5000);
Task<int> t = new Task<int>(() =>{return 1;};
t.Start();
然后你用这段代码跟这段代码比较下:
Task<int> t = new Task<int>(() =>
{
System.Threading.Thread.Sleep(5000);
return 1;
});
t.Start();
看出区别了吗?它们的 Task 的执行内容并不是你说的是相同的,而是不同的。
@Launcher: @Launcher:
你的意思应该是
return 1;
可以展开成
Task<int> t = new Task<int>(() =>{return 1;};
这个好像没有资料说明啊。。能详细解释下吗
@★luan: 这不用资料说明,这是基本的程序语言知识,如有资料的话,那也就是《编译原理》。
return 1 等同于 Task.FromResult(1) 能理解不?