gpt4 book ai didi

c# - 严格的 MVVM 和 Task.ConfigureAwait(false)

转载 作者:行者123 更新时间:2023-11-30 22:03:10 25 4
gpt4 key购买 nike

我正在重写我们的 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 线程上并且完全没有问题。

这两种情况都使 WPF 在某个时候执行 UI 线程编码。但是,我比较了两者的性能并且有显着差异。我执行了一个循环 1000 次,其中一个对象被绑定(bind)到一个 View ,然后再次设置为 null,这是以毫秒为单位的结果:

一个任务延迟为 10 毫秒的 await 调用

  • 15623 毫秒,ConfigureAwait(false)
  • 51700ms 没有

任务延迟为 10 毫秒的三个等待调用

  • 46917 毫秒,ConfigureAwait(false)
  • 82647ms 没有

这个基准测试远非完美,但似乎将属性编码回 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com