我正在整理一个简单的C#应用程序,用户在“命令栏”中键入命令,并实时获取结果。
例如,我可以输入google stackoverflow
,然后向Google发送API调用,获取每个结果并在ui中显示它们。
目前,如果用户在键入时暂停超过1/4秒,我会触发“搜索”方法,因此如果您在中间暂停,则可以触发google stack
和google stackoverflow
。
现在实际上api正在进行(相当慢的)数据库查询,这会导致ui在第一次搜索完成时锁定,然后尝试在第二次搜索时开始。
是否有一种简单的(C#4.0)方法在一个单独的线程中运行搜索调用,如果用户继续输入,我可以取消/中止?
e.g。
Task<string> thread;
string getSearchResults(string input) {
... Do some work ...
}
string userPaused(string search) {
if(this.thread.isRunning()) this.thread.Kill();
this.thread = new Task<String>(getSearchResults(string input);
return this.thread.result();
}
我看过Tasks api,看起来好像你可以在工作中杀死一个任务,它建议使用一段时间看并传递一个shouldStop
布尔值,但是在API期间调用下载结果没有while循环。
如果您需要获取返回值,则线程文档会指向您的任务。
答案 0 :(得分:1)
您可以使用Tasks
创建它们,然后在不再需要时取消。如果您无法取消正在进行的操作(如数据库查询) - 您可以在返回结果之前始终取消。您的代码可能是这样的(未经过测试,只是草稿):
var tokenSource2 = new CancellationTokenSource();
CancellationToken ct = tokenSource2.Token;
var task = Task.Factory.StartNew(() =>
{
ct.ThrowIfCancellationRequested();
var result = Database.GetResult(); // whatever database query method you use.
ct.ThrowIfCancellationRequested();
return result;
}, tokenSource2.Token);
因为你可以看到它会查询数据库并在没有请求取消时返回值,但如果你试图取消任务 - 它将不会返回值,而是抛出你需要捕获的OperationCanceledException
。有关详细信息,请访问MSDN Task Cancellation,但我认为这应该会给您一个想法。不要担心大任务数量 - 如果您的查询不是很慢也无关紧要 - 用户将无法触发如此多的搜索。如果您使用异步方式查询数据库 - 您可以更多地改进此代码,但这也不应该太难。