gpt4 book ai didi

WPF、MVVM 和异步工作

转载 作者:行者123 更新时间:2023-12-04 23:07:49 25 4
gpt4 key购买 nike

我知道这个问题以前在这里被问过,但我已经阅读了几个对我没有帮助的答案。

我有一个 ComboBox 需要从数据库中获取与选择相关的一些信息(可能在失去焦点时,在滚动期间停止一千次调用)。此信息仅用于显示,并不重要,因此进入后台线程/任务听起来像是完美的解决方案。虽然它确实需要几秒钟,因为它正在从一些非常大的表中获取计数。用户应该可以自由地继续执行其他任务,因为此信息实际上仅用于显示/引用。

This question提倡使用后台 worker ,但这种解决方案有两个问题。 1)在工作人员已经运行时更改选择会引入问题。您可以不第二次启动它,这意味着当它返回时不再显示新选择的有效信息,或者尝试取消它(这并不总是有效)。 2)由于某种原因,我无法解释,如果该方法在 Model 中,则实际访问后台工作人员的数据库的方法返回比在 ViewModel 中慢,我认为它不属于。我真的不知道为什么。

This question有几票,但 OP 的问题措辞很差,选择的答案只是说“是的,应该可以”。

This question's method看起来很有希望,但链接的视频长达一个小时(我看了整件事),并且只触及调度员 10-15 秒而没有解释它。如果有人有更深入地介绍此方法的文章的链接,那就太好了。

线程池,如 suggested here看起来这可能是最好的方法,因为多个查找请求只是排队,而不是导致已经运行的错误。但是,它没有解释如何使用线程池,而是链接到 MSDN 文章。如果有人链接到更深入地介绍此方法的文章,那将是理想的,因为它似乎是更好的解决方案(当然,我可能是错的)。

我真的很想对此进行研究,但是这些答案中的大多数只是告诉您使用什么方法,而不是如何使用它。我真的在寻找“操作方法”。

最佳答案

好的。你的问题:

  • 您有一个带有项目列表的选择控件
  • 您有一个 昂贵的 返回一些结果的操作当前选中项目 (注意,这个操作应该很昂贵,不仅仅是返回需要时间,为了让你担心不能同时拥有太多)——所以你需要并行执行
  • 返回的结果没有作用,只显示——异步也是如此
  • 如果当前选中的项目发生变化,您不再需要之前的结果——之前的请求应该尽快取消,因为它们是 昂贵的

  • 您应该使用最新的 .NET 技术做什么:
  • 使用 Reactive Extensions (Rx),设置 throttle ,使其仅在用户保持当前选择至少 500 毫秒时触发(当用户按住向下箭头键时,您不希望产生许多任务)
  • 当 throttle 启动时,调用异步 的方法(异步 CTP)等待任务中的操作(长时间运行以避免线程池饥饿),并放入一个取消 token ;保存当前选择以供稍后比较
  • 当操作返回时,将结果设置到你的数据上下文中(你的显示控件应该绑定(bind)到它)——异步方法总是在 UI 线程上继续,所以你不必担心线程访问
  • 如果 throttle 触发并且有一个未完成的任务/取消 token ,首先使用取消 token 取消任务,然后按照 #2 生成新任务。 await 将抛出,因为 Task 已取消,但这并不重要,因为您不再需要它。
  • 这里没有并发问题,因为异步 CTP 始终在 UI 线程上继续。就您的所有操作而言,它们都是单线程的,不会相互影响。

  • 我认为,如果您将 Async CTP 与 Rx 一起使用,则大约需要 10 行代码。

    注意:如果您的操作是 不贵 ,您不必使用取消 token 。只允许任务运行完成,但忽略结果。但是,仍然建议您尽早取消数据库查询,虽然它在客户端机器上并不昂贵,但在服务器上却很昂贵。

    关于WPF、MVVM 和异步工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7084315/

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