2016-12-28 3 views
0

Ich habe ein Textfeld, das Eingabe akzeptiert und Async-Anfrage an den Server sendet.Async-Antwort für zwei verschiedene Anrufe mit TPL

Zuerst habe ich 'a' eingegeben und async Anfrage mit 'a' gesendet. Dann tippte ich sofort 'b' und schickte eine Anfrage mit 'ab'.

Die Antwort für 'ab' wird schneller zurückgegeben als die Antwort für 'a'. So landete ich für immer Antwort auf ‚a‘, obwohl Textbox hat den Wert ‚ab‘

Ich habe versucht, mit, aber es zeigt letzte Antwort (die ‚a‘)

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

Ich bin etwas newbiew . Kann mir jemand helfen, mit einem solchen Szenario umzugehen?

Antwort

2

Sie müssen nur sicherstellen, dass die vorherige Anfrage zuverlässig abgebrochen wird, wenn eine neue gesendet wird. Es dauert ein wenig Sanitär-, aber sobald Sie Ihren Kopf um das Muster zu bekommen ist es nicht schwierig:

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. 
    } 
} 

Haftungsausschluss: das erfordert vor, dass neue Anforderungen immer von einem einzigen Thread (UI-Thread höchstwahrscheinlich) anstehen.

+0

Danke für die Antwort. Eine Klarstellung, wenn es drei Anfragen für 'a', 'ab', 'abc' gibt und meine letzte Antwort für 'abc' ist - die Verwendung der Löschung löst die Ausnahme zweimal aus (für vorheriges 'a' und 'ab'), richtig ? –

+2

@YeasinAbedinSiam, das hängt davon ab, wie schnell der Benutzer tippt. Wenn sie wirklich schnell tippen, werden 'a' und 'ab' Operationen abgebrochen, ja. Je langsamer sie tippen, desto mehr Operationen laufen bis zum Ende und gelangen schließlich zum "Prozess/Anzeige-Antwort" -Teil - ohne Ausnahmen. –

Verwandte Themen