首页新闻找找看学习计划

async await 异步

0
悬赏园豆:10 [已解决问题] 解决于 2015-07-09 19:11

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可以。


还有写一个异步的方法应该怎么写呢

萨尔的主页 萨尔 | 初学一级 | 园豆:20
提问于:2015-07-08 10:22
< >
分享
最佳答案
0

其实吧,这些在 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;
}

收获园豆:10
Launcher | 高人七级 |园豆:45040 | 2015-07-08 10:43

我就是不知道为什么会这样的。

 

比如

// await Task

//如果这个Task是一个异步方法返回的,如下,他就会阻塞

Public async Task<int> Func()
{
    //方法中没有用到 await关键字
}

//如果这个Task是New Task出来的, 就不会阻塞

Task<int> t = new Task<int>(() =>
{
   //方法中也可以不用 await关键字
}

//注意 上面2个Task的执行的内容是相同的,只是生成Task的方式不一样。 

//为什么会这样呢?
萨尔 | 园豆:20 (初学一级) | 2015-07-08 11:01

@★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 | 园豆:45040 (高人七级) | 2015-07-08 11:25

@Launcher: @Launcher: 

 

你的意思应该是

return 1;

可以展开成

Task<int> t = new Task<int>(() =>{return 1;};

 这个好像没有资料说明啊。。能详细解释下吗

萨尔 | 园豆:20 (初学一级) | 2015-07-08 12:52

@★luan: 这不用资料说明,这是基本的程序语言知识,如有资料的话,那也就是《编译原理》。

return 1 等同于 Task.FromResult(1) 能理解不?

Launcher | 园豆:45040 (高人七级) | 2015-07-08 13:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册