【发布时间】:2017-07-22 14:11:19
【问题描述】:
给定表示传入请求的 Observable A ...
interface IRequest
{
string Id { get; }
}
IObservable<IRequest> requests;
和表示响应的 Observable B ...
IObservable<string> responses;
我需要测量产生响应所需的时间。我当前的解决方案如下所示。这可行,但我不确定这是否可以简化或更简化。我还担心实际响应时间 ([GEN]) 和观察到的响应时间 ([OBS]) 之间的偏差,如果将 generatedResponseTime 设置为低于 50 毫秒,这种偏差就会变得非常显着。
class Program
{
public class Request
{
public string Id { get; set; }
}
static void Main(string[] args)
{
var generatedResponseTime = 100;
var responseSub = new Subject<string>();
IObservable<Request> requests = Observable.Interval(TimeSpan.FromMilliseconds(1000))
.Select(x=> new Request { Id = x.ToString("d") });
IObservable<string> responses = responseSub.AsObservable();
var responseTime = requests
.Where(x => !string.IsNullOrEmpty(x.Id))
.Select(req => new { Id = req.Id, Start = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() })
.SelectMany(req => responses
.Where(reqId => reqId == req.Id)
.Select(_ => new { RequestId = req.Id, ResponseTime = (int)(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - req.Start) })
.Take(1))
.Publish()
.RefCount();
requests.ObserveOn(TaskPoolScheduler.Default)
.Subscribe(req =>
{
Console.WriteLine($"[GEN] {req.Id} = {generatedResponseTime} ms");
Thread.Sleep(generatedResponseTime);
responseSub.OnNext(req.Id);
});
responseTime.Subscribe(x => Console.WriteLine($"[OBS] {x.RequestId} = {x.ResponseTime} ms"));
Console.ReadLine();
}
}
【问题讨论】:
-
您能否为此提供minimal reproducible example?我可以复制、粘贴和运行以查看代码的工作原理吗?
-
这是我见过的最好的minimal reproducible example 之一。为此 +1!
-
你为什么有
.Publish().RefCount()? -
@Enigmativity 只是因为使用它的现实世界项目有多个订阅者观察这个和其他几个遥测流。
-
你使用的真正的
requests是一个永远不会完成的可观察对象吗?
标签: c# system.reactive reactive-programming