问题标签 [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.
asynchronous - C# 5.0 异步如何工作?
我正在尝试了解 C# 5 的新异步功能是如何工作的。假设我想开发一个原子增量函数来增加一个虚构的 IntStore 中的整数。仅在一个线程中对该函数进行多次调用。
在我看来,这个功能是有缺陷的。对 IncrementKey 的两次调用可以从 IntStore 返回相同的数字(例如 5),然后将其设置为 6,从而丢失其中一个增量?
如果 IntStore.Get 是异步的(返回任务)以便正常工作,如何重写?
性能至关重要,是否有避免锁定的解决方案?
c# - 从等待中恢复是如何实现的?
我一直在阅读 Eric Lippert 关于 C# 5 中的异步的博文(第 4部分特别相关),并观看了 Anders PDC10 关于该主题的讨论,我不清楚如何在单线程上下文中恢复异步方法的延续。
两个消息来源都讨论了在单线程 UI 循环中使用异步方法来提高响应能力,在 Anders 的示例中,他提到当异步任务完成时,它的继续是通过向消息泵添加消息来安排的。
异步方法是否真的知道它需要执行看起来像是特定于上下文的操作,或者这是一种简化?
更一般地说,如何在单线程上下文中处理异步方法的恢复?是否需要在单个线程内进行调度?
c# - 捕获异步 void 方法引发的异常
使用 Microsoft for .NET 的异步 CTP,是否可以在调用方法中捕获异步方法引发的异常?
所以基本上我希望异步代码中的异常能够冒泡到我的调用代码中,如果这可能的话。
c# - 如何在没有异步 CTP 的情况下实现等待
您将如何实现与 Async CTPawait
关键字类似的功能?是否有一个await
在所有情况下都可以工作的简单实现,或者是否await
需要针对不同场景的不同实现?
c# - 如何为 foreach 创建并行预取
鉴于在 C#、TPL、Parallel Extensions、Async CTP、Reactive Extensions 中执行异步操作的许多新方法,我想知道并行化以下获取和处理部分的最简单方法是什么:
附带条件是,虽然可以随时获取ProcessFile
文件,但一次只能处理一个文件,并且应该按顺序调用。
简而言之,以流水线方式获取FetchFile
和运行的最简单方法是什么ProcessFile
,即同时发生?
c# - C# 中的 C++ std::async 与异步/等待
我想知道新的 c++ 功能std::async
是否与两个 C# 关键字 async/await 相当,如果不是,为什么?
c# - 在 C# 中异步插入到 MongoDB
如何在 C# 中对 MongoDB 进行异步插入/更新?惰性持久性的术语是什么?
- 后写
wcf - 实体导航属性应该通过 WCF 服务预加载还是延迟加载?
我们在 WCF 服务上使用自我跟踪实体。实体在没有加载其导航属性的情况下返回给客户端。
一次发送所有导航属性或根据需要延迟加载它们是更好的主意吗?如果延迟加载,异步加载它们是个好主意吗?到目前为止,我所有的 WCF 服务调用都使用 await/async 关键字。
我对一次性加载它们有些担心,因为有些对象有很多并不总是使用的导航属性。例如,Consumer 实体目前大约有 20 个,预计会获得更多。一些示例包括地址、电话、文档和注释。用户可以设置自己的工作区,这样处理文档的人可能在消费者加载时总是需要 Documents 属性,而大多数其他人则不需要。
c# - 通过 WCF 服务异步延迟加载分离自跟踪实体的导航属性?
我有一个 WCF 客户端,它将自我跟踪实体传递给使用 MVVM 构建的 WPF 应用程序。应用程序本身有一个动态界面。用户可以根据他们所处的角色或他们正在执行的任务来选择他们希望在其工作区中显示哪些对象。
我的自跟踪实体有很多导航属性,其中很多是不需要的。由于其中一些对象可能非常大,我只想在请求时加载这些属性。
我的应用程序如下所示:
[WCF] <---> [ClientSide Repository] <---> [ViewModel] <---> [View]
我的模型是自我跟踪实体。客户端存储库在将模型返回给请求它的 ViewModel 之前连接了一个 LazyLoad 方法(如果需要)。所有 WCF 服务调用都是异步的,这意味着 LazyLoad 方法也是异步的。
LazyLoad 的实际实现给我带来了一些麻烦。这是我想出的选项。
编辑 - 我删除了代码示例以尝试使其更易于阅读和理解。如果您想查看,请查看以前版本的问题
选项 A
在 Getter 中从 WCF 服务器异步延迟加载模型的属性
好:按需加载数据非常简单。XAML 中的绑定会加载数据,因此如果控件在屏幕上,则数据会异步加载并在其存在时通知 UI。如果没有,则不会加载任何内容。例如,<ItemsControl ItemsSource="{Binding CurrentConsumer.ConsumerDocuments}" />
将加载数据,但是如果界面的 Documents 部分不存在,则不会加载任何内容。
错误:在启动之前无法在任何其他代码中使用此属性,因为它将返回一个空列表。例如,如果尚未加载文档,则以下调用将始终返回 false。
选项 B
需要时手动调用加载数据
好:易于实现 - 只需添加LoadConsumerDocumentsSync()
和LoadConsumerDocumentsAsync()
方法
不好:必须记住在尝试访问数据之前加载数据,包括在绑定中使用数据时。这可能看起来很简单,但它很快就会失控。例如,每个 ConsumerDocument 都有一个 UserCreated 和 UserLastModified。有一个 DataTemplate 定义了带有 ToolTip 的 UserModel,其中显示了额外的用户数据,例如扩展名、电子邮件、团队、角色等。因此,在显示文档的 ViewModel 中,我必须调用LoadDocuments
,然后遍历它们并调用LoadConsumerModified
and LoadConsumerCreated
。它也可以继续下去……在那之后我不得不LoadUserGroups
和LoadUserSupervisor
。它还存在循环循环的风险,其中 aUser
有一个Groups[]
属性,而 aGroup
有一个Users[]
属性
选项 C
到目前为止我最喜欢的选择...创建两种访问属性的方法。一个同步和一个异步。将对 Async 属性进行绑定,并且任何代码都将使用 Sync 属性。
好:数据根据需要异步加载 - 正是我想要的。也没有太多额外的编码,因为我需要做的就是修改 T4 模板以生成这些额外的属性/方法。
不好:有两种方法来访问相同的数据似乎效率低下且令人困惑。您需要记住何时应该使用Consumer.ConsumerDocumentsAsync
而不是Consumer.ConsumerDocumentsSync
. WCF 服务调用也有可能多次运行,这需要为每个导航属性添加一个额外的 IsLoaded 属性,例如 IsConsumerDocumentsLoaded。
选项 D
跳过异步加载,只需在设置器中同步加载所有内容。
好:很简单,不需要额外的工作
不好:数据加载时会锁定 UI。不想要这个。
选项 E
让某人告诉我还有另一种方法可以做到这一点并指出我的代码示例:)
其他注意事项
一些 NavigationProperties 将在将对象返回给客户端之前加载到 WCF 服务器上,但是其他的太昂贵而无法使用。
除了在选项 C 中手动调用 Load 事件之外,这些都可以通过 T4 模板完成,因此我几乎不需要编写代码。我所要做的就是在客户端存储库中连接 LazyLoad 事件并将其指向正确的服务调用。
asynchronous - 带有等待的多个并行异步调用
据我所知,当运行时遇到下面的语句时,它将函数的其余部分包装为异步调用的方法的回调(someCall()
在本例中)。在这种情况下anotherCall()
,将作为回调执行someCall()
:
我想知道是否可以让运行时像这样执行:someCall()
以异步方式调用并立即返回调用线程,然后anotherCall()
类似地调用(无需等待someCall
完成)。因为我需要这两种方法异步运行,并假设这些调用只是触发并忘记调用。
async
是否可以仅使用and await
(不使用旧begin
/end
机制)来实现此场景?