- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在重写我们的 MVVM 框架的某些部分以利用异步/等待功能,请考虑以下 VM 代码:
private async Task LoadDossier(int ID)
{
//VM INotifyProperty
Dossiers = new ObservableCollection<Dossier>(await BubManager.GetAllBubDossiersForEmployeeByDossierIdAsync(ID).ConfigureAwait(false));
//VM INotifyProperty
SelectedDossier = Dossiers.First(x => x.Id == ID);
//VM INotifyProperty
DossierEmployer = await EmployerManager.GetEmployerByIdAsync(SelectedDossier.EmployerId).ConfigureAwait(false);
//VM INotifyProperty
DossierEmployee = await EmployeeManager.GetEmployeeByIdAsync(SelectedDossier.EmployeeId).ConfigureAwait(false);
//All VM INotifyProperties
if (SelectedDossier != null && DossierEmployer != null)
{
RszNr = DossierEmployer.RszNr;
FundsNr = DossierEmployer.FundsNr;
RrNr = DossierEmployee.RrNr;
}
RefreshGlobalCommanding();
}
因为我使用的是严格的 MVVM,所以这里没有一个属性需要 UI 线程,因此我到处都使用 ConfigureAwait(false)
。我知道在 ObservableCollection
中添加/删除时这是不可能的,但这里不是这种情况。
ConfigureAwait(false)
不利于可读性 IMO编辑
在与 Stephen 讨论后,我得出的结论是,这基本上是一回事。
ConfigureAwait(false)
,您就是在告诉 WPF 回调不必在 UI 线程上进行。设置 INotifyProperty 时,WPF 确保 UI 线程收到通知。这两种情况都使 WPF 在某个时候执行 UI 线程编码。但是,我比较了两者的性能并且有显着差异。我执行了一个循环 1000 次,其中一个对象被绑定(bind)到一个 View ,然后再次设置为 null,这是以毫秒为单位的结果:
一个任务延迟为 10 毫秒的 await 调用
ConfigureAwait(false)
任务延迟为 10 毫秒的三个等待调用
ConfigureAwait(false)
这个基准测试远非完美,但似乎将属性编码回 UI 线程比在同一线程上运行 await 调用后强制所有内容的成本更低。然而,这需要更多测试才能为所有场景给出明确的答案。
我只是把它放在这里以证明两者之间存在差异。我的建议是在这种情况下不要使用 ConfigureAwait,因为它会在更改代码时增加出现异常的机会,可读性差,同事可能不理解这一点,并通过使用它获得错误的安全感。
最佳答案
Is this code a good practice?
就我个人而言,我选择将所有数据绑定(bind)属性视为具有 UI 亲和性。
一个原因是不同的MVVM框架在这方面有不同的能力; WPF 确实会为您处理这个问题(对于简单的属性),但其他人不会。
If it is, then why can't you make this the default behavior?
当 async
在 CTP 中时,有大量关于 await
的默认行为的讨论。每种方式都有利有弊。
关于c# - 严格的 MVVM 和 Task.ConfigureAwait(false),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26236014/
这个问题在这里已经有了答案: ConfigureAwait(true) not returning on the context it was awaited on (2 个答案) 关闭 2 年前。
我有一个要在 Visual Studio 中搜索的特定模式。 基本上,我想搜索包含 await 的行,但不见了 ConfigureAwait在声明的最后。 我有一些模式可以在 regex-tester
我正在开发 Blazor Server Web 应用程序,但我对使用 .ConfigureAwait(false) 感到困惑。我知道我不应该在组件代码中使用它,但我不确定嵌套代码。例如:我正在调用异步
试图了解何时应该使用 ConfigureAwait()。 据书: When an async method resumes after an await, by default it will res
我正在尝试使用 ConfigureAwait,因为我想了解它是如何工作的。 因此,我编写了以下小型控制台应用程序(实际上在 LINQPad 中运行): void Main() { // Use
我已经阅读了很多关于 async/await 编程模型的文章,仍然有一些不是很清楚的地方,我想分享一下我对这些的困惑。 假设我们有以下配置: 主要的异步方法是 public async Task Do
以为我正在处理 ConfigureAwait,然后我尝试了一个实验。 我的理解是 ConfigureAwait(false) 只有在有同步上下文的情况下才会有所作为。 ASP、WPF 等应该有上下文,
这是一些 WinForms 代码: async void Form1_Load(object sender, EventArgs e) { // on the UI thread De
我有一个在 thread1 上运行的代码。我以同步方式调用函数(使用异步方法但它不应该打扰我 - 异步方法不会将代码变为异步)。 我有一个 ConfigureAwait 设置为 false 的 awa
这个问题是在 ASP.NET WebApi 2 的上下文中提出的(不是 ASP.NET Core)。我试图对这个主题进行自己的研究,但是我找不到明确的答案。 官方MSDN documentation为
我想弄清楚是否应该在顶级请求上使用 ConfigureAwait(false)。从该主题的某种权威阅读这篇文章: http://blog.stephencleary.com/2012/07/dont-
所以我知道我通常应该在库代码中使用 ConfigureAwait(false)。异常(exception)是当我知道继续将需要调用者上下文时。但是,如果我不知道会是这样的话,我不知道该怎么办。我猜我不
如果在图书馆我有这个 public async DoSomething() { await Foo(); } 然后我将其称为 lib.DoSomething().ConfigureAwait(f
示例: static void Main(string[] args) { int counter = 0; var t = new System.Timers.Timer()
我到处都读到我应该使用 ConfigureAwait(false) 来避免死锁和出于性能原因。我们在我们的应用程序中使用 ConfigureAwait。但可能会删除 ConfigureAwaits,因
假设有这样一个方法的服务库 public async Task GetPersonAsync(Guid id) { return await GetFromDbAsync(id); } 遵循Syn
我读了这篇文章https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html - 但是我看到了一个矛盾: 我知道 UI 线程死
假设我编写了一个依赖于async 方法的库: namespace MyLibrary1 { public class ClassFromMyLibrary1 { pub
我已经阅读了一些关于 async/await 的内容,并试图通过在 UI 线程上调用 WebClient.DownloadStringTaskAsync 来重现 Windows 窗体中的死锁场景,并且
当使用 await 时,默认情况下捕获 SynchronizationContext(如果存在)并且 await 之后的代码块(延续 block )是使用该上下文执行(这会导致线程上下文切换)。 pu
我是一名优秀的程序员,十分优秀!