HTML5技术

await和async更多的理解 - 谷歌’s(2)

字号+ 作者:H5之家 来源:H5之家 2017-10-28 16:01 我要评论( )

// Three things to note in the signature: // - The method has an async modifier. // - The return type is Task or TaskT. (See "Return Types" section.) // Here, it is Taskint because the return stateme

// Three things to note in the signature: // - The method has an async modifier. // - The return type is Task or Task<T>. (See "Return Types" section.) // Here, it is Task<int> because the return statement returns an integer. Task<int> AccessTheWebAsync() { // You need to add a reference to System.Net.Http to declare client. HttpClient client = new HttpClient(); // GetStringAsync returns a Task<string>. That means that when you await the // task you'll get a string (urlContents). Task<); 1) // You can do work here that doesn't rely on the string from GetStringAsync. DoIndependentWork(); 2) // The await operator suspends AccessTheWebAsync. // - AccessTheWebAsync can't continue until getStringTask is complete. // - Meanwhile, control returns to the caller of AccessTheWebAsync. // - Control resumes here when getStringTask is complete. urlContents = await getStringTask; 3) // The return statement specifies an integer result. urlContents.Length; }


对上面的例子做了1)、2)、3)红色标记,

在1)处定义了一个网络流操作,认为此方法可能会耗时,如果在此处,添加一个await client.GetStringAsync("http://msdn.microsoft.com")

对程序来说,这是一个异步操作,开辟了一个新线程,同时程序在此处返回给被调线程或UI,等网络流返回结束时继续在运换醒被调线程或主线程,并由于继续往下运行其它方法。 对于像这样的网站,一级一级的向上await 不会造成任何的吞吐量或响应速度的降低,可是新的问题来了,接下来2)处 DoIndependentWork()方法必须等到1)完成才能继续运行,“跳出来站在更高点看下”,这不相当于”同步“了吗?按顺序一步一步来的,子线程关没有给我们太多的优势。

是的,确实如此。

我们知道,让“子线程或任务”干事情,主线程继续他的活儿才对的,所以在1)处,不应该用await,让”线程或任务再跑一会“。 由于我们没有加await,于是主线程或调用线程与调用网络流的子线程”一块运行“了。

当程序运行至3)时,1)标记处的任务可能已经完成或者快要完成,此时用了await目的只有一个,下面的一句话 urlContents.Length 要用到异步结果,必须待等结束,并同时向调用线程或主线程返回标记,

以使调用者最快的响应,而不是等待以至于阻塞。

回过头来看下:我们即要多线程或多任务执行我们的程序,让耗时的任务得到执行,同时又要给调用者快速响应,不管他有没有完成任务! 这才是真正的目的。

再想想我们前面说的,DoIndependentWork()调用,加不加await,方法肯定是执行的,同时与该方法异步还是同步也没有关系,只是要不要做”标记“而已

至于加不加标记,就是上面我们解释的理由,忘了,回过头来看看吧
再来看看下面的问题:

如果一个方法里存在多个await,会如何执行呢?

我们可以按照上面的猜想下,await某些时候功能很像return,多个await,相必,第一个awiat会返回,并作标记,后面的任何代码都要等待 如:


TaskXAsync() { await XXAsync(); await XXXAsync(); }

 

事实情况确实如此,XXXAsync()必须等待XXAsync()方法执行结束!此时不会影响调用者的响应速度,但会影响我们代码的执行效率,这点和两个共步方法稍有区别

TaskXAsync() { XX(); XXX(); }

像上面的例子XX()和XXX()两同步方法,不仅按顺序执行,而且调用者也无法拿回调用权,也就是无法及时响应,必须待两个方法都结束为止。

”偷偷的想下“,我想在XX(),XXX()方法前加一个await 不就行了吗?

回过头来想想,上面说过:"await 仅可用于由 async 关键字修改的异步方法中"

实际上我们在VS加上那么await会报错,编译不过!   希望破灭。。。此时已经看出被async修饰的目的。因为XX()和XXX()并没被修饰。

那好了,我们就强制在同步方法上用async !

XX() { code here... }

 

实际上当我们强制在XX()方法上加上Async时VS已经提示如下:

 

很显然,同步方法,想提高调用者的响应速度是不可能仅仅靠async 就能完成的!根本原因就是调用者与执行方法在同一个线程上。

 

 

 再回过头来继续我们上面的例子

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • await和async在一般处理程序中的使用 - wolfy

    await和async在一般处理程序中的使用 - wolfy

    2015-12-24 11:00

  • 你眼中的async/await是什么样的? - richiezhang

    你眼中的async/await是什么样的? - richiezhang

    2015-12-05 11:22

  • NodeJs通过async/await处理异步 - Yika丶J

    NodeJs通过async/await处理异步 - Yika丶J

    2015-11-26 08:38

网友点评