【发布时间】:2014-08-13 15:40:38
【问题描述】:
我想创建一个在我输入时使用 linq 搜索的任务,如果用户输入另一个字符,它应该取消任务并重新创建搜索,我有以下代码:
private Task SearchChannels;
private CancellationTokenSource cancelSearch;
public void PopulateChannels(string newValue)
{
IsSearchingChannels = true; //This just shows a progressbar
if (SearchChannels != null && cancelSearch!= null)
if (SearchChannels.Status == TaskStatus.Running ||
SearchChannels.Status == TaskStatus.WaitingToRun ||
SearchChannels.Status == TaskStatus.WaitingForActivation ||
SearchChannels.Status == TaskStatus.WaitingForChildrenToComplete)
{
cancelSearch.Cancel();
SearchChannels.Wait();
}
cancelSearch = new CancellationTokenSource();
SearchChannels = new Task(() => Channels = new PagedObservableCollection<Channel>(ContractManager.Channels.Where(x => x.Name.ToLower().StartsWith(newValue)).AsParallel().WithCancellation(cancelSearch.Token).ToList()), cancelSearch.Token); //PagedObservableCollection is just a simple class with a list that keeps all items and an ObservableCollection for current items shown
SearchChannels.Start();
SearchChannels.ContinueWith((continuation) => IsSearchingChannels = false); // this just hides the progressbar when done
}
我得到这个异常:
'System.OperationCanceledException' 类型的异常
发生在System.Core.dll 但未在用户代码中处理
附加信息:操作已取消。
我是任务和取消令牌的初学者,有人可以从这里指导我走正确的道路吗?我基本上希望任务检查它是否已经运行,取消它,然后使用新值再次运行它(我想让这个“SearchBox”功能类似于 Visual Studio 在解决方案资源管理器中的搜索,它会在你输入时搜索)
【问题讨论】:
-
你看过Rx.net
Buffer().Select(searchString => Observable.StartAsync(cancelToken => Search(searchString, cancelToken)).Switch() -
谢谢,如果没有其他方法,我会研究 Rx,看起来有点学习曲线 :) 我试过你的例子,但我不明白它应该如何以及在哪里使用过,还有 Buffer()。没有给我select之类的方法,我应该使用什么(我已经添加了
using System.Reactive.Linq)
标签: c# linq entity-framework task cancellation-token