我有一个接受输入的文本框,并向服务器发送异步请求。
首先我键入'a'并使用'a'发送异步请求。然后我立即键入'b'并发送带'ab'的请求。
'ab'的响应比'a'的响应更快。所以即使文本框的值为'ab'
,我最终也得到'a'的回复我试过了,但它显示了最后一个回复(用于'a')
Task.Run(() => {
// send request
}).ContinueWith((t) => {
// get response
});
我有些新闻。任何人都可以帮我解决这种情况吗?
答案 0 :(得分: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线程)。