问题标签 [async-await]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2074 浏览

c# - AsyncCTP:创建一个 IAwaitable 的类

我发现自己想要实现一个 IAwaitable 类(实现异步调用而不阻塞线程的东西)。

我已经安装了最新版本的 AsyncCTP,编译器说我需要一个 IsCompleted() 成员。好的,所以 CTP 预览已经移动了一点(我明白了,就像它是预览一样)

问题:AsyncCTP 语言扩展现在期望什么接口?

问题:在这一切中,我假设我可以通过 lamda/delegate 向“IAwaitable”发出信号?这可能吗?我们调用 EndAwait 吗?智能感知建议您调用 EndAwait 来检索结果……所以这听起来不对。有任何想法吗?

到目前为止,我发现的所有示例都是针对 AsyncCTP 库已经实现的功能,例如:

来自101 AsyncSamplesCS

背景:

我发现自己在 Jon Skeets 页面上(再次)查看这个示例

0 投票
3 回答
17406 浏览

c# - 如何使任务可等待

昨天我开始使用 Microsoft CTP 异步库,但在任何地方我都找不到等待任务的正确实现。我知道它必须有这样的实现?:

但是我现在如何实现一个任务,比如说,等待 5 秒,然后返回一些字符串,例如“Hello World”?

一种方法是直接使用 Task ,如下所示:

但是我将如何使用等待的实现来做到这一点?还是我只是误解了一切?

感谢您提供任何信息/帮助:)

0 投票
2 回答
9411 浏览

.net - 为什么异步的返回类型必须为 void、Task 或 Task

我试图用异步 CTP 弄脏我的手,我注意到编译器抱怨异步返回类型。其他类型有什么问题?

一个简单的演示

0 投票
2 回答
4953 浏览

c# - C# Async CTP 中的“等待”线程会发生什么?

我一直在阅读新的 asyncawait关键字,这听起来很棒,但是在我迄今为止看过的任何介绍视频中,我都无法找到一个关键问题的答案(我还阅读了白皮书一会儿回来)。

await假设我在主 UI 线程上的嵌套函数中有一个调用。此时线程会发生什么?控制是否返回到消息循环并且 UI 线程可以自由处理其他输入?

当等待的任务完成时,整个堆栈是否被推送到消息队列中,以便控制将通过每个嵌套函数返回,或者这里完全发生了其他事情?

其次(虽然我引起了你的注意),但我真的不明白为什么异步方法需要用async. 不能异步执行任何方法吗?如果我想异步执行一个方法但它没有 async 关键字怎么办——有没有办法简单地做到这一点?

干杯。:)

编辑: 诚然,如果我可以编译示例代码,我可能会自己弄清楚,但由于某种原因,我在那里遇到了障碍。我真正想知道的是延续在多大程度上继续......它是冻结整个调用堆栈,在任务完成时恢复它,还是只返回这么远?是否需要将函数本身标记为异步以支持继续,或者(正如我最初问的那样)它是否继续整个调用堆栈?

如果它没有冻结整个调用堆栈,那么当异步等待遇到非异步调用函数时会发生什么?它在那里阻塞吗?这不会破坏等待的意义吗?我希望您能看到我在这里遗漏了一些理解,希望有人可以填写,以便我可以继续学习。

0 投票
1 回答
470 浏览

task-parallel-library - Silverligh 5 SDK RC + Async CTP:让它工作

刚刚安装了 Silverligh 5 SDK RC。在使用 Async CTP 的项目中使用它时出现问题。

AsyncCtpLibrary_Silverlight.dll 和 mscorlib.dll 都包含位于完全相同命名空间中的任务类型(以及其他一些与任务相关的类型)。

这是错误消息:
在此处输入图像描述

因此,为了解决这种歧义,我将 AsyncCtpLibrary_Silverlight.dll 上的别名更改为“AsyncCtp”。然后相应地更改了cs文件:

这似乎解决了歧义问题,但现在无法识别“async”关键字。这些是相关的错误:
在此处输入图像描述

在此处输入图像描述

有没有办法绕过它,或者它是一个死胡同?

0 投票
1 回答
458 浏览

playframework - Controller.await(int millis)之后没有重定向的动作链接

我不确定这是否没有按预期工作,这只是我感到困惑。

我想做的是异步延迟一个动作,await(int millis)我似乎可以成为朋友。

这是发生的事情:

1. Application.index显示一个发送 POST 到的表单Application.something

应用程序/控制器/Application.java

应用程序/视图/应用程序/index.html


2. Application.something做它的事,然后链接回index.

应用程序/控制器/Application.java


3. Play 引发应用程序错误:“模板 Application/something.html 不存在”

因此,当在执行被暂停/恢复后被render()调用时,它会尝试渲染 的模板,这当然不存在。Application.indexApplication.somethingApplication.something

如果我删除await(500)一切正常(发出 302index并按预期呈现)。

我可以强制重定向

并得到我想要的结果,但这感觉很难看。

我也可以设置

await按预期在和 作品中的渲染Application.index(实际上是作品中的魔力)之后手动进行Controller.template()


所以基本上,一切都好,我被迫在调用之后使用字符串await而不是方法调用,还是有点不对劲?

干杯,托拜厄斯。

0 投票
3 回答
28211 浏览

c# - 在任务中抛出异常 - “await” vs Wait()

在 TPL 中,当在 Task 中抛出异常时,它会被 AggregateException 包装。但是在使用await关键字
时不会发生同样的情况。 这种行为的解释是什么?

0 投票
3 回答
1682 浏览

c# - 使用 C# 的新异步功能等待网络数据包的最佳方式是什么

我最近一直在玩新的 Async CTP,但我遇到了一种情况,我不确定如何进行。

在我当前的代码库中,我使用了“工作”和“工作管理器”的概念。作业的存在仅用于处理初始消息、发送响应,然后等待响应。

我已经有基于同步套接字的现有代码,其中网络线程正在等待数据到达,然后将其传递给事件处理程序,最终传递给作业管理器。

作业管理器查找将处理该消息的作业,并将其传递。

所以场景是这样的:

  1. 作业经理收到新消息并启动作业。
  2. 作业启动、处理消息并发送回复消息。
  3. 此时,作业将等待对答复的响应。

这是一个伪代码示例:

但我不完全确定如何在第 3 步继续。作业管理器将获得响应,然后将其交给正在运行的作业。但我不确定如何让工作等待响应。

我考虑过创建一个等待的任务,它只是阻塞在 WaitHandle 上,但这是最好的解决方案吗?

在这种情况下,我还能做些什么吗?

编辑 关于异步 CTP 的主题,在不使用 UI 的情况下会发生什么。我已经阅读了 Eric Lippert 的 Async 博客,但我不相信它曾经触及过在没有 UI 线程的情况下一切如何在后台工作的主题(它是从后台工作人员分离出来还是......?)

0 投票
8 回答
142132 浏览

c# - 为什么我不能在 lock 语句的主体中使用 'await' 运算符?

C# (.NET Async CTP) 中的 await 关键字不允许在 lock 语句中。

来自MSDN

await 表达式不能用于同步函数、查询表达式、异常处理语句的 catch 或 finally 块、lock 语句的块或不安全的上下文中。

我认为编译器团队出于某种原因很难或不可能实现。

我尝试使用 using 语句解决:

然而,这并没有按预期工作。ExitDisposable.Dispose 中对 Monitor.Exit 的调用似乎无限期地阻塞(大部分时间),导致死锁,因为其他线程试图获取锁。我怀疑我的工作的不可靠性以及在 lock 语句中不允许使用 await 语句的原因在某种程度上是相关的。

有谁知道为什么在 lock 语句的主体中不允许 await ?

0 投票
1 回答
171 浏览

c# - 覆盖延续状态存储/恢复算法?

当我看到第一个关于 await 的消息时,我非常兴奋,我想了很多方法来使用它。其中之一是在我的 Web 框架中使用它来隐藏客户端/服务器交换的异步方面,就像它在几个框架中所做的那样。所以这里是交易:

我想写这样的东西:

我希望开发人员能够在服务器上编写此代码。正如您猜测p.Show()的那样,在 HttpResponse 中写入显示带有表单的页面的 html 代码,并将响应发送到客户端,因此,线程被终止,我永远不会到达下一条指令(FormResponse response =)。

所以这是我的问题:有没有办法做这样的事情?我知道 await 剪切代码,将其打包,为我们关闭,并将其存储在某个地方以便在 p.Show() 完成时将其回调。但是在这里,线程将被杀死,这是我的代码,它接收来自 Page 的提交响应,它必须处理它。所以我必须恢复“等待”创建的延续并自己执行它。

我变高了还是有可能?

编辑:附加信息

我可以多解释一点,但我们需要一个例子。想象一下,您想对 web 服务进行异步调用,您只需使用 await 然后调用 web。网络不显示任何页面,它返回信息片段,您可以继续下一个指令,因此对于网络,我们有:客户端 -> 服务器 A [-callwebs-> 服务器 B ->] 服务器 A -> 客户端。

现在,想象一个必须显示用户界面以从用户那里获取一些信息的网络,我们可以将这种网络称为 UIwebs(由多个 webapp 调用的可重用界面),它显示 ui,获取信息,然后发送它返回给调用者。

因此,对于 UI 网络,我们有:客户端 -> 服务器 A [-response_redirect-> 客户端 -get-> 服务器 B(这里是 UIweb,客户端输入任何内容)-response_redirect-> 客户端 -get-> ] 服务器 A ->客户

我放在括号中的内容必须由开发人员处理:

所以对于经典的网络,我可以想象异步页面正在“休眠”等待网络响应,但是对于 UI 网络,我们必须响应并重定向到客户端,所以页面是为 asp.net 完成的,SynchronizationContext 说没有更多的异步指令等待。

事实上,我在这里的需要就像打开 Web 服务器,并向它发送一个请求,以便在等待之后恢复执行代码所需的一切。

问候,朱利安