使用TPL进行两次不同调用的异步响应

时间:2016-12-28 04:29:45

标签: c# .net async-await task-parallel-library

我有一个接受输入的文本框,并向服务器发送异步请求。

首先我键入'a'并使用'a'发送异步请求。然后我立即键入'b'并发送带'ab'的请求。

'ab'的响应比'a'的响应更快。所以即使文本框的值为'ab'

,我最终也得到'a'的回复

我试过了,但它显示了最后一个回复(用于'a')

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

我有些新闻。任何人都可以帮我解决这种情况吗?

1 个答案:

答案 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线程)。