2013-05-08 41 views
0

我組建了一個簡單的C#應用​​程序,其中用戶類型命令爲「命令欄」,結果是實時獲取。C#生成新線程訪問Web服務中止

例如,我可以鍵入google stackoverflow,它會向API發送一個API調用請求,並獲取每個結果並將它們顯示在UI中。

如果用戶在打字時暫停超過1/4秒,目前我會關閉「搜索」方法,因此如果您在中間暫停,則可能會觸發google stackgoogle stackoverflow

現在在現實中,API是做一個(相當慢的)數據庫查詢,這將導致用戶界面鎖定,而第一次搜索完成後,它會嘗試啓動第二搜索之前。

有一個簡單的(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和它看起來並不彷彿可以在工作中殺死一個任務,它表明一個API過程中使用,同時外觀和傳遞shouldStop布爾值,但是調用下載結果沒有while循環。

但是,如果您需要獲取返回值,線程文檔將指出您需要執行的任務。

+1

看一看的CancellationToken結構:http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.aspx。看起來像是你在尋找。 – takemyoxygen 2013-05-08 11:13:25

+1

任務可能是你正在尋找的。你可以取消它們:http://msdn.microsoft.com/en-us/library/dd997396.aspx你需要使用取消令牌來做到這一點,並且當然要在你的任務方法內部取消取消。但是,由於大部分工作都是數據庫查詢 - 您可能只想放棄任務,根本不在意結果(只是照顧所有例外情況),並在搜索條件發生變化時觸發新任務。取決於你需要的東西 – Pako 2013-05-08 11:13:31

+0

你看了這裏:http://msdn.microsoft.com/en-us/library/dd997396.aspx – Marco 2013-05-08 11:14:25

回答

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

因此,大家可以看到它會查詢數據庫,並返回值時沒有取消的請求,但如果你將嘗試cancell任務 - 它不會返回價值,而是拋出你需要捕獲的OperationCanceledException。詳情請訪問MSDN Task Cancellation,但我認爲這應該給你一個想法。不要擔心大任務編號 - 如果您的查詢速度不是很慢,則無關緊要 - 用戶將無法觸發如此多的搜索。如果你有查詢數據庫的異步方式 - 你可以多修改一下這些代碼,但這也不應該太難。