WPF 中的线程

Threading in WPF

目前我在处理场景的 WPF 应用程序中工作。

我的应用程序具有搜索功能,并且会根据搜索条件填充网格。为了使应用程序响应,我们实施了 TPL。

像这样

Task.Factory.StartNew(() =>
 {
  //Webservice Call
   Dispatcher.Invoke(() =>
   {
     //Data from webservice assigned to Collection binded to Grid
   });
   }
);

我有一个问题。

假设我输入了搜索条件 'A' 并点击搜索,一秒钟之内我改变了主意并更新了搜索条件 'B',我点击了搜索按钮,我又想到了这个错了,我必须搜索其他内容,我将条件更改为 'C',然后再次单击“搜索”。 问题是 A 的服务响应时间为 20 秒,B 的服务响应时间为 25 秒,而 C 的服务响应时间仅为 5 秒。

根据我的搜索,我必须显示最新的搜索条件,那将是 C,但我的数据正在根据 B 的记录进行更新。我查看了网络,但没有得到任何帮助。我错过了什么吗?任何帮助将不胜感激。

对于一个非常敏感的自动搜索字段,我建议使用 RX Framework 而不是尝试滚动你自己的逻辑,这样你可以订阅更改的事件但也可以操纵它(缓冲它,保持最新)所以你可以很容易地说出 "Take key events, ignore them as long as there are new events and less thant 250ms passed, then do a search, drop that search if another search triggered in the meantime, else display it" 之类的东西。如果没有 RX Framework 和嵌套的 ifs 和取消,这不是你可以轻松编写的东西

参考这个 url 会有更多帮助,因为类似的事情已经在那里讨论过,并且很少有专家回答

了解 Cancellation Tokens

基本上每次搜索时,都会创建一个新的 CancellationTokenSource 并将其保留在搜索中 class。

CancellationToken 传递到您的异步函数中。 webcall 完成后,在更新结果之前检查令牌是否已被取消,或者直接调用 cancelToken.ThrowIfCancellationRequested()。 您甚至可以将其传递到您的网络电话中以立即取消电话,或使用令牌的 Register() 方法显式中止网络电话。

如果您进行新的搜索,请取消当前的令牌来源并创建一个新的。任何当前调用都将在不更新的情况下完成。