我知道此问题已在此处提出,但我已经阅读了几个对我没有帮助的答案。
我有一个ComboBox需要从数据库中获取与选择相关的一些信息(可能是丢失焦点,在滚动期间停止一千次调用)。此信息仅供显示,而不是关键,因此获得后台线程/任务听起来就像是完美的解决方案。它确实需要几秒钟,因为它从一些非常大的表中得到计数。用户应该可以自由地继续执行其他任务,因为这些信息仅用于显示/参考。
This question提倡使用后台工作者,但此解决方案有两个问题。 1)在工作人员已经运行时更改选择会引入问题。您可以不是第二次启动它,这意味着当它返回时它不再显示新选择的有效信息,或者尝试取消它(这并不总是有效)。 2)由于某些原因我无法解释,实际访问后台工作程序的数据库的方法如果方法在模型中比在ViewModel中返回更慢,我认为它不属于ViewModel。我真的不知道为什么。
This question有几张选票,但OP的问题措辞非常糟糕,选定的答案只是说“是的,应该有用。”
This question's method看起来很有希望,但链接的视频只有一个小时(我观看了整个事情),并且在没有解释的情况下只接触调度员10-15秒。如果某人有更深入地介绍这种方法的文章的链接,那就更好了。
线程池,因为suggested here看起来可能是最好的方法,因为多个查询请求只是排队,而不是导致已经运行的错误。但是,它没有解释如何使用线程池,而是链接到MSDN文章。如果有人链接到更深入地介绍这种方法的文章,那将是理想的,因为它似乎是更好的解决方案(当然,我可能是错的)。
我真的试图对此进行研究,但大多数答案只是告诉你使用什么方法,而不是如何使用它。我真的在寻找一个“操作方法”。
答案 0 :(得分:6)
行。你的问题:
使用最新的.NET技术应该做些什么:
我认为如果你使用带有Rx的Async CTP,它大约有10行代码。
注意:如果您的操作是非昂贵,则不必使用取消令牌。只允许任务运行完成,但忽略结果。但是,仍建议您尽早取消数据库查询,虽然在客户端计算机上并不昂贵,但在服务器上却很昂贵。
答案 1 :(得分:3)
您可以尝试使用异步绑定:
<ComboBox Name="theCombo" ... />
<TextBlock Text="{Binding Path=SomeSlowProperty, ElementName=theCombo, IsAsync=True}" />