繁体   English   中英

如何最快地获得第一个异步响应(并且不执行其余的)?

[英]How can I get the first async response fastest (and don't perform the remainder)?

这是设置:有一个联邦远程服务,它返回特定值是正确还是不正确。 我们可以根据需要发送请求,每个请求最多可以发送50个远程服务。

由于我们只需要使用正确的值,并且可能值的集合很小(~700),我们可以发送15个左右的50个批处理请求,正确的值将成为结果集的一部分。 因此,我使用了以下代码:

Observable
    .Range(0, requests.Count)
    .Select(i => Observable.FromAsync(async () =>
    {
        responses.Add(await client.FederalService.VerifyAsync(requests[i]));
        Console.Write(".");
    }))
    .Merge(8)
    .Wait();

但是 - 我不喜欢的是,如果之前的一个请求具有正确的值,我仍然会通过服务浪费时间运行所有可能性。 我试图让这次运行尽可能快。 我知道退出条件(响应代码从1到99,50-59内的任何响应代码表示该值是“正确的”)。

有没有办法让这个代码更聪明,所以我们最小化请求的数量? 不幸的是,我们验证的值是均匀分布的,因此对请求进行排序不会做任何事情(我知道)。

您应该考虑使用FirstAsync方法

我们示例中的秘密是FirstAsync方法。 我们实际上正在等待我们的观察结果返回的第一个结果并不关心任何进一步的结果

所以你的代码可能是这样的:

await Observable
    .Range(0, requests.Count)
    .Select(i => Observable.FromAsync(async () =>
    {
        responses.Add(await client.FederalService.VerifyAsync(requests[i]));
        Console.Write(".");
    }))
    .FirstAsync()
    .Subscribe(Console.WriteLine);

> System.Reactive.Linq.ObservableImpl.Defer`1[System.Reactive.Unit]

Rx和Await:一些Notes文章提供了类似方法的一些技巧。 例如,你有一个FirstAsync的重载,可以过滤,作为LINQ '方法First

await Observable
    .Range(0, requests.Count)
    .Select(i => Observable.FromAsync(async () =>
    {
        responses.Add(await client.FederalService.VerifyAsync(requests[i]));
        Console.Write(".");
    }))
    .FirstAsync(r => /* do the check here */)
    .Subscribe(Console.WriteLine);

你很亲密。 将您的observable更改为:

Observable
    .Range(0, requests.Count)
    .Select(i => Observable.FromAsync(async () =>
    {
        var response = await Task.FromResult(i); //replace with client.FederalService.VerifyAsync(requests[i])
        responses.Add(response);
        Console.Write($"{i}.");
        var responseCode = response; //replace with however you get the response code.
        return responseCode >= 50 && responseCode <= 59;
    }))
    .Merge(8)
    .Where(b => b)
    .Take(1)
    .Wait();

这样,您的observable继续发出值,因此您可以继续对其进行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM