2016-12-28 75 views
0

我有一個接受輸入並向服務器發送異步請求的文本框。與TPL的兩個不同呼叫的異步響應

首先我鍵入'a'併發送異步請求'a'。然後我立即鍵入'b'併發送'ab'請求。

'ab'的響應返回速度比'a'響應快。所以,我最終得到了響應「A」,即使文本框有值「AB」

我試圖用,但它顯示上次響應(這是「A」)

Task.Run(() => { 
     // send request 
}).ContinueWith((t) => { 
     // get response 
}); 

我有些newbiew 。任何人都可以幫助我如何處理這種情況?

回答

2

您只需確保在發出新請求時可以可靠地取消先前的請求。這需要一些管道的,但一旦你讓你的頭周圍的模式是不是很難:

CancellationTokenSource TextBoxCancellationTokenSource; 

async void TextBox_TextChanged() 
{ 
    // Harvest values needed to make the request *before* the first await. 
    string requestArg = TextBox.Text; 

    if (TextBoxCancellationTokenSource != null) 
    { 
     // Cancel previous request. 
     TextBoxCancellationTokenSource.Cancel(); 
    } 

    TextBoxCancellationTokenSource = new CancellationTokenSource(); 

    CancellationToken cancellationToken = TextBoxCancellationTokenSource.Token; 

    try 
    { 
     // Optional: a bit of throttling reducing the number 
     // of server requests if the user is typing quickly. 
     await Task.Delay(100, cancellationToken); 

     cancellationToken.ThrowIfCancellationRequested(); // Must be checked after every await. 

     var response = await Task.Run(() => GetResponse(requestArg), cancellationToken); 

     cancellationToken.ThrowIfCancellationRequested(); // Must be checked after every await. 

     ProcessResponse(response); 
    } 
    catch (OperationCanceledException) 
    { 
     // Expected. 
    } 
} 

免責聲明:以上要求新的請求總是從一個單獨的線程(UI線程最有可能的)排隊。

+0

感謝您的回覆。一個澄清,如果有三個請求'a','ab','abc',我最後的迴應是'abc' - 使用取消將拋出異常兩次(對於之前的'a'和'ab'),右? –

+2

@YeasinAbedinSiam,這取決於用戶輸入的速度。如果他們打字速度非常快,那麼'a'和'ab'操作將被取消,是的。他們輸入的越慢,越多的操作將實際運行到完成並最終進入「過程/顯示響應」部分 - 沒有例外。 –