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 会有更多帮助,因为类似的事情已经在那里讨论过,并且很少有专家回答
基本上每次搜索时,都会创建一个新的 CancellationTokenSource 并将其保留在搜索中 class。
将 CancellationToken 传递到您的异步函数中。 webcall 完成后,在更新结果之前检查令牌是否已被取消,或者直接调用 cancelToken.ThrowIfCancellationRequested()
。
您甚至可以将其传递到您的网络电话中以立即取消电话,或使用令牌的 Register() 方法显式中止网络电话。
如果您进行新的搜索,请取消当前的令牌来源并创建一个新的。任何当前调用都将在不更新的情况下完成。
目前我在处理场景的 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 会有更多帮助,因为类似的事情已经在那里讨论过,并且很少有专家回答
基本上每次搜索时,都会创建一个新的 CancellationTokenSource 并将其保留在搜索中 class。
将 CancellationToken 传递到您的异步函数中。 webcall 完成后,在更新结果之前检查令牌是否已被取消,或者直接调用 cancelToken.ThrowIfCancellationRequested()
。
您甚至可以将其传递到您的网络电话中以立即取消电话,或使用令牌的 Register() 方法显式中止网络电话。
如果您进行新的搜索,请取消当前的令牌来源并创建一个新的。任何当前调用都将在不更新的情况下完成。