问题标签 [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.
c# - AsyncCTP:创建一个 IAwaitable 的类
我发现自己想要实现一个 IAwaitable 类(实现异步调用而不阻塞线程的东西)。
我已经安装了最新版本的 AsyncCTP,编译器说我需要一个 IsCompleted() 成员。好的,所以 CTP 预览已经移动了一点(我明白了,就像它是预览一样)
问题:AsyncCTP 语言扩展现在期望什么接口?
问题:在这一切中,我假设我可以通过 lamda/delegate 向“IAwaitable”发出信号?这可能吗?我们调用 EndAwait 吗?智能感知建议您调用 EndAwait 来检索结果……所以这听起来不对。有任何想法吗?
到目前为止,我发现的所有示例都是针对 AsyncCTP 库已经实现的功能,例如:
背景:
我发现自己在 Jon Skeets 页面上(再次)查看这个示例
c# - 如何使任务可等待
昨天我开始使用 Microsoft CTP 异步库,但在任何地方我都找不到等待任务的正确实现。我知道它必须有这样的实现?:
但是我现在如何实现一个任务,比如说,等待 5 秒,然后返回一些字符串,例如“Hello World”?
一种方法是直接使用 Task ,如下所示:
但是我将如何使用等待的实现来做到这一点?还是我只是误解了一切?
感谢您提供任何信息/帮助:)
.net - 为什么异步的返回类型必须为 void、Task 或 Task
我试图用异步 CTP 弄脏我的手,我注意到编译器抱怨异步返回类型。其他类型有什么问题?
一个简单的演示
c# - C# Async CTP 中的“等待”线程会发生什么?
我一直在阅读新的 asyncawait
关键字,这听起来很棒,但是在我迄今为止看过的任何介绍视频中,我都无法找到一个关键问题的答案(我还阅读了白皮书一会儿回来)。
await
假设我在主 UI 线程上的嵌套函数中有一个调用。此时线程会发生什么?控制是否返回到消息循环并且 UI 线程可以自由处理其他输入?
当等待的任务完成时,整个堆栈是否被推送到消息队列中,以便控制将通过每个嵌套函数返回,或者这里完全发生了其他事情?
其次(虽然我引起了你的注意),但我真的不明白为什么异步方法需要用async
. 不能异步执行任何方法吗?如果我想异步执行一个方法但它没有 async 关键字怎么办——有没有办法简单地做到这一点?
干杯。:)
编辑: 诚然,如果我可以编译示例代码,我可能会自己弄清楚,但由于某种原因,我在那里遇到了障碍。我真正想知道的是延续在多大程度上继续......它是冻结整个调用堆栈,在任务完成时恢复它,还是只返回这么远?是否需要将函数本身标记为异步以支持继续,或者(正如我最初问的那样)它是否继续整个调用堆栈?
如果它没有冻结整个调用堆栈,那么当异步等待遇到非异步调用函数时会发生什么?它在那里阻塞吗?这不会破坏等待的意义吗?我希望您能看到我在这里遗漏了一些理解,希望有人可以填写,以便我可以继续学习。
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”关键字。这些是相关的错误:
有没有办法绕过它,或者它是一个死胡同?
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.index
Application.something
Application.something
如果我删除await(500)
一切正常(发出 302index
并按预期呈现)。
我可以强制重定向
并得到我想要的结果,但这感觉很难看。
我也可以设置
await
按预期在和 作品中的渲染Application.index
(实际上是作品中的魔力)之后手动进行Controller.template()
。
所以基本上,一切都好,我被迫在调用之后使用字符串await
而不是方法调用,还是有点不对劲?
干杯,托拜厄斯。
c# - 在任务中抛出异常 - “await” vs Wait()
在 TPL 中,当在 Task 中抛出异常时,它会被 AggregateException 包装。但是在使用await关键字
时不会发生同样的情况。
这种行为的解释是什么?
c# - 使用 C# 的新异步功能等待网络数据包的最佳方式是什么
我最近一直在玩新的 Async CTP,但我遇到了一种情况,我不确定如何进行。
在我当前的代码库中,我使用了“工作”和“工作管理器”的概念。作业的存在仅用于处理初始消息、发送响应,然后等待响应。
我已经有基于同步套接字的现有代码,其中网络线程正在等待数据到达,然后将其传递给事件处理程序,最终传递给作业管理器。
作业管理器查找将处理该消息的作业,并将其传递。
所以场景是这样的:
- 作业经理收到新消息并启动作业。
- 作业启动、处理消息并发送回复消息。
- 此时,作业将等待对答复的响应。
这是一个伪代码示例:
但我不完全确定如何在第 3 步继续。作业管理器将获得响应,然后将其交给正在运行的作业。但我不确定如何让工作等待响应。
我考虑过创建一个等待的任务,它只是阻塞在 WaitHandle 上,但这是最好的解决方案吗?
在这种情况下,我还能做些什么吗?
编辑 关于异步 CTP 的主题,在不使用 UI 的情况下会发生什么。我已经阅读了 Eric Lippert 的 Async 博客,但我不相信它曾经触及过在没有 UI 线程的情况下一切如何在后台工作的主题(它是从后台工作人员分离出来还是......?)
c# - 为什么我不能在 lock 语句的主体中使用 'await' 运算符?
C# (.NET Async CTP) 中的 await 关键字不允许在 lock 语句中。
来自MSDN:
await 表达式不能用于同步函数、查询表达式、异常处理语句的 catch 或 finally 块、lock 语句的块或不安全的上下文中。
我认为编译器团队出于某种原因很难或不可能实现。
我尝试使用 using 语句解决:
然而,这并没有按预期工作。ExitDisposable.Dispose 中对 Monitor.Exit 的调用似乎无限期地阻塞(大部分时间),导致死锁,因为其他线程试图获取锁。我怀疑我的工作的不可靠性以及在 lock 语句中不允许使用 await 语句的原因在某种程度上是相关的。
有谁知道为什么在 lock 语句的主体中不允许 await ?
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 服务器,并向它发送一个请求,以便在等待之后恢复执行代码所需的一切。
问候,朱利安