C#生成新线程以访问要中止的Web服务

时间:2013-05-08 11:07:23

标签: c# multithreading

我正在整理一个简单的C#应用​​程序,用户在“命令栏”中键入命令,并实时获取结果。

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

目前,如果用户在键入时暂停超过1/4秒,我会触发“搜索”方法,因此如果您在中间暂停,则可以触发google stackgoogle 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循环。

如果您需要获取返回值,则线程文档会指向您的任务。

1 个答案:

答案 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,但我认为这应该会给您一个想法。不要担心大任务数量 - 如果您的查询不是很慢也无关紧要 - 用户将无法触发如此多的搜索。如果您使用异步方式查询数据库 - 您可以更多地改进此代码,但这也不应该太难。