生成新线程来访问web服务以中止

本文关键字:web 访问 服务 新线程 线程 | 更新日期: 2023-09-27 18:12:31

我正在制作一个简单的c#应用程序,其中用户在"命令栏"中输入命令,并实时获取结果。

例如,我可以输入google stackoverflow,它会向google发送一个API调用,获取每个结果并在ui中显示它们。

目前,如果用户在输入时暂停超过1/4秒,我就会触发"search"方法,所以如果你在中间暂停,它就会触发google stackgoogle stackoverflow

现在,在现实中,api正在执行一个(相当慢的)数据库查询,这导致ui在第一次搜索完成时锁定,在它试图开始第二次搜索之前。

是否有一个简单的(c# 4.0)的方式来运行搜索调用在一个单独的线程,我可以取消/中止,如果用户继续输入?

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();
}

我看过任务api,它看起来不像你可以在工作中杀死一个任务,它建议使用一个while look并传递一个shouldStop布尔值,但是在api调用下载结果时没有while循环。

如果你需要得到返回值,Threading文档会给你指明任务。

生成新线程来访问web服务以中止

您可以使用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任务取消,但我认为这应该给您一个想法。不要担心任务数量太多——如果你的查询不是很慢,那也没关系——用户将无法触发这么多的搜索。如果您使用异步方式查询数据库-您可以进一步改进这段代码,但这也不应该太难。