- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在开发一个在很大程度上使用 TAP 的异步应用程序。每个具有生成 Task
方法的类也有一个 TaskScheduler
注入(inject)其中。这使我们能够执行明确的任务调度,据我所知,这不是 Microsoft 使用异步 CTP 的方式。
我对新方法(隐式调度)的唯一问题是我们以前的理念一直是“我们知道延续将始终指定他们的任务调度程序,所以我们不需要担心我们完成的上下文任务”。
摆脱它确实让我们有点担心,因为它在避免细微的线程错误方面效果非常好,因为对于每一位代码,我们都可以看到编码器已经记得考虑他在哪个线程上。如果他们没有指定任务调度程序,那就是错误。
问题 1: 谁能向我保证隐式方法是个好主意?我看到 ConfigureAwait(false) 和遗留/第三方代码中的显式调度引入了很多问题。例如,我如何才能确保我的“充满等待”的代码始终在 UI 线程上运行?
问题 2: 那么,假设我们从代码中删除所有 TaskScheduler
DI 并开始使用隐式调度,那么我们如何设置默认任务调度程序?如何在方法中途更改调度程序,就在等待一个昂贵的方法之前,然后再将其重新设置?
(附:我已经阅读了 http://msmvps.com/blogs/jon_skeet/archive/2010/11/02/configuring-waiting.aspx )
最佳答案
我会尝试回答。 ;)
Question 1: Can anyone reassure me that the implicit approach is a good idea? I see so many issues being introduced by ConfigureAwait(false) and explicit scheduling in legacy/third party code. How can I be sure my 'await-ridden' code is always running on the UI thread, for example?
ConfigureAwait(false)
的规则非常简单:如果您的方法的其余部分可以在线程池上运行,则使用它,如果您的方法的其余部分必须运行,则不要使用它在给定的上下文中(例如,UI 上下文)。
一般来说,ConfigureAwait(false)
应该被库代码使用,而不是被 UI 层代码(包括 UI 类型的层,例如 MVVM 中的 ViewModels)使用。如果该方法是部分后台计算和部分 UI 更新,则应将其拆分为两种方法。
Question 2: So, assuming we remove all TaskScheduler DI from our code and begin to use implicit scheduling, how do we then set the default task scheduler?
async
/await
一般不使用TaskScheduler
;他们使用“调度上下文”的概念。这实际上是 SynchronizationContext.Current
,只有在没有 SynchronizationContext
时才会回退到 TaskScheduler.Current
。因此,可以使用 SynchronizationContext.SetSynchronizationContext
替换您自己的调度程序。您可以在 this MSDN article on the subject 中阅读有关 SynchronizationContext
的更多信息.
默认的调度上下文应该是您几乎所有时间都需要的,这意味着您不需要去弄乱它。我只在进行单元测试或控制台程序/Win32 服务时更改它。
What about changing scheduler midway through a method, just before awaiting an expensive method, and then setting it back again afterward?
如果你想做一个昂贵的操作(大概是在线程池上),然后等待
TaskEx.Run
的结果。
如果您出于其他原因(例如,并发性)想要更改调度程序,则等待
TaskFactory.StartNew
的结果。
在这两种情况下,方法(或委托(delegate))都在另一个调度程序上运行,然后方法的其余部分在其常规上下文中恢复。
理想情况下,您希望每个 async
方法都存在于单个执行上下文中。如果方法的不同部分需要不同的上下文,则将它们拆分为不同的方法。此规则的唯一异常(exception)是 ConfigureAwait(false)
,它允许方法在任意上下文中启动,然后恢复到线程池上下文以执行剩余部分。 ConfigureAwait(false)
应该被视为一种优化(库代码默认启用),而不是一种设计理念。
以下是我在“Thread is Dead”演讲中的一些观点,我认为它们可能对您的设计有所帮助:
ConcurrentExclusiveSchedulerPair
是新的 ReaderWriterLock
)。关于c# - 异步 CTP - 推荐的任务调度方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8760295/
我在 menu.ctp 中的 img 链接在 view.ctp 和 login.ctp 中消失了 这是我的菜单.ctp header class="header row">
我对使用 4.0 框架和 Entity Framework 4.0 非常感兴趣。目前 .net 4.0 在 CTP 中,我是 EF 4.0 在 CTP 预览版中。我将不会再编码几个月,但我不确定 .n
我正在使用最新的 Entity Framework CTP 5 版本并构建一个简单的 asp.net MVC 博客,其中我只有两个表:发布和评论。这完全是在 POCO 中完成的,我只需要 DbCont
源代码托管在哪里? git 中心?我到处都找不到它。 最佳答案 是的,它与项目的其余部分一起位于 GitHub 上。它位于 master 分支下。 https://github.com/AArnott
我尝试安装 Async CTP,它说安装已成功完成,但“我的文档”中没有安装任何内容,而且我找不到示例。如何查看带有库的示例并试用它们? 最佳答案 你有另一台可以安装的机器吗? 我的上网本没有正确接受
有谁知道是否可以“Bin 部署”异步 CTP? 由于 Async 的很大一部分基本上是一个编译器技巧,我认为预编译我的应用程序并将其部署到没有安装 Async CTP 的服务器可能会奏效。不幸的是,事
我想在 pdo_error.ctp 中添加一些错误。我到底想做什么?我有一个可以将值插入 MySQL 数据库的表单,如果我将 text 或 varchar 输入留空,然后将其插入到数据库中,但如果我离
在下面的示例中,CTP 仅考虑用户类属性,但我希望用户表中包含基类属性。 有没有办法告诉 CTP 包含基类属性?或者有什么替代解决方案? class PersonDBContext : DbConte
我创建了一个名为 Solution.sln 的空 Visual Studio 解决方案,我将其加载到工作区的第一行。然后我将一个项目添加到解决方案,并将工作区更新为现在应该包含一个项目的最新解决方案。
我一直在基因编程类型的场景中试验 Roslyn API。这似乎是进行此类编程的好方法,但简单场景的实际实现似乎并不是很简单,这意味着我可能不太了解如何正确使用此 API。这是我在实验中尝试修改的一个简
索引页面有样式,而其余页面没有。当我在浏览器中检查级联样式表 (CSS) 文件时,我惊讶地发现除了 Index.ctp 之外,所有页面都无法访问这些 CSS 文件。所有页面都在同一个文件夹中,并且提供
在我的 default.ctp 页面中,我保留适用于整个应用程序的导航和结构内容。例如菜单结构和基于列的 CSS。但是,我想更改我的登录页面,使其看起来完全不同(没有菜单、没有列等) 有没有办法只为单
有什么办法可以勾搭这两个人吗? 我唯一找到的是一篇小文章,上面说截至 2011 年 5 月,MonoTouch 既不支持 Async CTP,也不支持 Reactive Extensions。我真的不
我已经创建了一些示例 ViewModel 来测试 DPs 与 asyncCtp 的使用情况: public class SampleVm : DependencyObject { public
我正在使用 DotNetOpenAuth CTP 库实现一个 oauth 提供程序。所以我创建了一个 mvc3 应用程序,它有一个 OAuth Controller ,其中有 3 个方法,目的是授权第
我目前正在开发一个在很大程度上使用 TAP 的异步应用程序。每个具有生成 Task 方法的类也有一个 TaskScheduler 注入(inject)其中。这使我们能够执行明确的任务调度,据我所知,这
根据此处的博文Data Annotations in the Entity Framework应该有一个名为“Key”的列的属性,它允许您标记实体的主键。但是我无法在 .Net 3.5 或 .Net
我正在通读 TAP Whitepaper ,并且对第 22 页上为实现超时而给出的这个示例感到困惑: “考虑一个 UI 应用程序,它想要下载图像并在下载图像时禁用 UI。但是,如果下载时间过长,则应重
我正在尝试将项目重写为可移植类库。但问题是它使用的是 Async CTP,我无法将其编译为 WP 和 Windows Store App 的库。如果我不包含引用 AsyncCtpLibrary.dll
我想看看 Async CTP 是否带有可移植类库? 最佳答案 没有。异步 CTP 具有适用于桌面、电话、Silverlight 4 和 Silverlight 5 的不同 dll。 希望在不久的将来,
我是一名优秀的程序员,十分优秀!