WPF、MVVM和异步工作

WPF、MVVM和异步工作,wpf,asynchronous,backgroundworker,threadpool,dispatcher,Wpf,Asynchronous,Backgroundworker,Threadpool,Dispatcher,我知道以前这里有人问过这个问题,但我已经通读了几个对我没有帮助的答案 我有一个组合框,需要从数据库中获取一些与选择相关的信息(可能是关于失去焦点,以便在滚动期间停止一千个调用)。这些信息仅用于显示,并不重要,因此进入后台线程/任务听起来是完美的解决方案。但它确实需要几秒钟,因为它从一些非常大的表中获取计数。用户应该可以自由地继续执行其他任务,因为这些信息实际上仅用于显示/参考 主张使用后台工作人员,但此解决方案有两个问题。1) 当辅助进程已在运行时更改选择会导致问题。您可以不在第二次启动它,这意

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

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

主张使用后台工作人员,但此解决方案有两个问题。1) 当辅助进程已在运行时更改选择会导致问题。您可以不在第二次启动它,这意味着当它返回时,它不再显示新选择的有效信息,或者尝试取消它(这并不总是有效)。2) 由于某些原因,我无法解释,如果方法在模型中,那么实际访问后台工作程序数据库的方法返回的速度比在ViewModel中慢,我认为ViewModel不属于该方法。我真的不知道为什么

有好几票,但OP的问题措辞非常糟糕,选择的答案只是说“是的,应该行。”

看起来很有希望,但是链接的视频有一个小时长(我看了整件事),只涉及调度员10-15秒,没有解释。如果有人链接到一篇更深入地介绍这种方法的文章,那就好了

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


我真的试着做了这方面的研究,但大多数答案只是告诉你使用什么方法,而不是如何使用它。我真的在寻找“操作方法”。

您可以尝试使用异步绑定:

<ComboBox Name="theCombo" ... />
<TextBlock Text="{Binding Path=SomeSlowProperty, ElementName=theCombo, IsAsync=True}" />

好的。你的问题:

  • 您有一个带有项目列表的选择控件
  • 您有一个昂贵的操作,该操作会从当前选定的项返回一些结果(请注意,此操作应该是昂贵的,而不仅仅是为了让您担心在同一时间不会有太多的结果),因此您需要并行执行此操作
  • 不会对返回的结果执行操作,只显示结果——因此异步执行
  • 如果当前所选项目发生更改,则您不再需要以前的结果,并且应该尽快取消以前的请求,因为它们的成本很高
  • 使用最新的.NET技术,您应该做什么:

  • 使用反应式扩展(Rx),设置一个节流阀,使其仅在用户保持当前选择至少500毫秒(例如,当用户保持按下向下箭头键时,您不希望产生许多TAK)时才会触发
  • 当油门启动时,调用一个async方法(async CTP),该方法等待任务中的操作(长时间运行以避免线程池饥饿),并放入一个取消令牌;保存当前选择以供以后比较
  • 当操作返回时,将结果设置到数据上下文(显示控件应绑定到该上下文)——异步方法始终在UI线程上继续,因此您不必担心线程访问
  • 如果油门触发且存在未完成的任务/取消令牌,则首先使用取消令牌取消任务,然后根据#2生成新任务。等待将抛出,因为任务已取消,但这并不重要,因为您不再需要它
  • 这里没有并发问题,因为异步CTP总是在UI线程上继续。就您的所有操作而言,它们都是单线程的,不会相互干扰
  • 我认为,如果使用异步CTP和Rx,大约需要10行代码


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

    您希望异步执行什么操作?1) 是否加载并填充组合框项目?2) 当用户选择项目时,是否执行其他操作?你应该把问题中的其他东西都去掉,把它说清楚,详细说明你的实际问题。我认为这很清楚。我不需要填充组合框,我需要从数据库中获取与所做选择相关的信息,并在UI上显示这些信息。我的问题是,有几种解决方案被认为是关于stackoverflow的答案,但没有解释。如果我删除了问题的这一部分,恐怕我会得到指向这些答案的链接,或者类似的简短回答。这听起来很不错,但在测试之前我无法将其标记为答案,因为我不知道如何使用RX或Async CTP,我将不得不在网上搜索教程。如果你有一个链接到一个可能会加快事情的速度。谢谢你给了我一个很好的回答!