![]() |
1
741
使用时
下面是一个例子,我希望我可以解释一些正在进行的高级细节:
第二种情况是
|
![]() |
2
166
他们要 异步的 代码易于编写和阅读,是的。 一点也不。
不,因为
你可以找到我的
|
![]() |
3
163
下面是一个简单的例子
注:
在下面的示例中
第一个街区
就是这么做的。它立即开始所有的任务
在下面的示例中
第二个街区
开始一项任务并等待它完成(这就是
例子
有关同步上下文的额外信息
注意:这里的情况对我来说有点模糊,所以如果我做错了什么,请纠正我,我会更新答案。对它的工作原理有一个基本的了解是很重要的,但是只要你从不使用它,你就可以不用成为它的专家
这其中有一个方面使得
如果希望允许主代码在没有原始上下文的新线程上继续,只需使用false而不是true,这样它就知道不需要恢复上下文。
程序完成暂停后,它将继续 在一个完全不同的线程上,有不同的上下文。这就是性能改进的来源——它可以在任何可用的线程上继续,而不必恢复它开始时的原始上下文。
这东西让人困惑吗?是啊!你能搞清楚吗?可能!一旦你掌握了这些概念,那么继续斯蒂芬·克利里的解释,这些解释往往更倾向于那些对
|
![]() |
4
147
在其他答案的基础上,看一看 await (C# Reference)
|
![]() |
5
59
在一个简单的控制台程序中显示上述说明:
结果是:
因此,
因此,没有线程被阻塞。 |
![]() |
6
41
一点
读这篇文章,我认为它是对
|
![]() |
7
21
下面是一个快速的控制台程序,可以让后面的人看清楚。这个
|
![]() |
8
15
这里所有的答案都是
|
![]() |
9
12
这个答案旨在提供一些特定于ASP.NET的信息。 通过在MVC控制器中使用async/await,可以提高线程池的利用率并获得更好的吞吐量,如下文所述, http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4
|
![]() |
10
10
异步/等待实际上Async/Await是一对关键字,它们只是创建异步任务回调的语法糖。 以该操作为例:
上面的代码有几个缺点。错误不会传递,而且很难阅读。 但是Async等着进来帮我们:
注意 具有 异步调用 不 任务库 下面是等待和不等待解决方案的比较
这是异步方法:
实际上,您可以在不使用await关键字的情况下调用异步方法,但这意味着这里的任何异常都会在释放模式下被吞噬:
异步和等待不适用于并行计算。它们是用来不堵住你的主线的。当涉及到asp.net或Windows应用程序时,由于网络调用而阻塞主线程是一件坏事。如果你这样做,你的应用程序将得到无响应,甚至崩溃。 ms docs 更多的例子。 |
![]() |
11
10
快速学习。。
在第6步:执行停止,因为它已经用完了工作。要继续,需要getStringTask(某种函数)的结果。因此,它使用
这是“异步”的最大优点! 任务! 任务已通过。 等待任务 (不是方法,不是价值)。值将在任务中设置。任务状态将设置为“完成”。呼叫方只监视任务(#6)。后续阅读 here 学习问题反思:1分钟
因为学习
快速通过语法sugar:5分钟
我们提到等待还是异步?不,调用上面的方法,你就会得到一个任务。你可以监控。你已经知道任务返回了什么。。一个整数。
开发人员犯了一个错误,没有实现
提示:尝试查找现有的异步实现(如
问题:快速将现实世界中正常代码的实现更改为 异步操作:2分钟
轻松!
调用代码行的更改如下
下一个在哪里? 我们可以看一段精彩的视频 Converting Synchronous Calls to Asynchronous in ASP.Net Core |
![]() |
12
9
老实说,我仍然认为最好的解释是关于未来和维基百科上的承诺: http://en.wikipedia.org/wiki/Futures_and_promises 基本思想是,您有一个单独的线程池,可以异步执行任务。使用时。但是,该对象承诺它将在某个时间执行操作,并在您请求时提供结果。这意味着,当您请求结果但尚未完成时,它将被阻塞,否则将在线程池中执行。 从那里你可以优化一些事情:一些操作可以异步实现,你可以通过批量处理后续请求和/或重新排序来优化文件IO和网络通信等事情。我不确定这是否已经在微软的任务框架中,但如果不是,这将是我要添加的第一件事。 实际上,你可以在C#4.0中用收益率实现未来的模式。如果你想知道它是如何工作的,我可以推荐这个链接做一个体面的工作: http://code.google.com/p/fracture/source/browse/trunk/Squared/TaskLib/ |
![]() |
13
8
看这个小提琴 https://dotnetfiddle.net/VhZdLU (并在可能的情况下加以改进)用于运行 它显示了 Task,Task.WaitAll(),异步和等待 同一程序中的运算符。 这把小提琴应该能清楚你的执行周期概念。 这是示例代码
|
![]() |
14
7
异步等待简单解释
一个人可以 早上的火车。这是他们正在做的一切,因为这是他们目前正在执行的主要任务。(同步编程(您通常所做的!) 另一个人可以 等待 什么是异步编程?
async关键字实际上是做什么的? 在方法名前面加上async关键字,如
为什么这很重要? 在许多软件系统中,主线程是专门用于与用户界面相关的操作的。如果我在我的计算机上运行一个非常复杂的递归算法,需要5秒才能完成,但是当用户试图单击我的应用程序上的任何内容时,我在主线程(UI线程)上运行这个算法,它将看起来被冻结,因为我的主线程已经排队,并且当前正在处理太多的操作。因此,主线程无法处理鼠标单击以从按钮单击运行方法。 什么时候使用异步等待? 理想情况下,当您做任何不涉及用户界面的事情时,请使用异步关键字。 假设你正在编写一个程序,允许用户在手机上画草图,但每5秒它就会在互联网上查看天气。 我们应该每5秒等待一次投票呼叫,以获取网络的天气,因为应用程序的用户需要不断与移动触摸屏交互以绘制漂亮的图片。 如何使用Async和wait 下面是上面的示例,下面是一些如何编写它的伪代码:
附加说明-更新
不能等待不是以下任务的方法:
请随意查看任务类的源代码 here . |
![]() |
15
3
|
![]() |
16
3
在更高的层次上:
2) 您可以等待返回任务或T类型任务的方法。不能等待异步void方法。
4) 如果主线程看到仍在执行的任务上有wait,则它不会等待它并返回到当前方法的调用方。这样,应用程序保持响应。 5) 等待处理任务,现在将在线程池中的单独线程上执行。 6) 当这个等待任务完成时,下面的所有代码将由单独的线程执行
|
![]() |
17
2
我的理解也是,应该在组合中加入第三个术语:
如果相反,您将
|
![]() |
18
1
本文 MDSN:Asynchronous Programming with async and await (C#) 明确解释:
|
![]() |
19
1
在下面的代码中,HttpClient方法GetByteArrayAsync返回一个任务getContentsTask。任务是在任务完成时生成实际字节数组的承诺。await运算符应用于getContentsTask,以暂停SumPageSizesAsync中的执行,直到getContentsTask完成。同时,控件返回给SumPageSizesAsync的调用方。当getContentsTask完成时,await表达式计算为字节数组。
|
![]() |
20
1
|
![]() |
21
0
这里的答案可以作为关于等待/异步的一般指导。它们还包含一些关于wait/async如何连接的细节。在使用这种设计模式之前,我想和您分享一些您应该知道的实践经验。 前景 线程,这是 . 前台线程承担着构建应用程序的负担,包括视图、视图模型、初始动画,以及其他任何与这些元素绑定的东西。所以当你等待前景时 停止 您当然可以使用各种方法等待后台线程:
这些备注的完整代码位于 https://github.com/marcusts/xamarin-forms-annoyances . 请参阅名为awaitsyncAntipPattern.sln的解决方案。 GitHub站点还提供了指向有关此主题的更详细讨论的链接。 |
![]() |
Sante Kyaku · 为什么我要用等待来获得承诺的结果? 2 年前 |
![]() |
Tomas Kubes · 是最大并发数。NET任务有限吗? 2 年前 |
![]() |
punkish · 并行异步获取/等待承诺。全部的 2 年前 |
![]() |
dapidmini · 未捕获的承诺嵌套异步函数承诺错误处理 2 年前 |
![]() |
smith · 如何在vue中使用wait/async 2 年前 |