在访问 Web 资源的 DispatcherTimer 上运行的 Async-Await 函数会定期失败

本文关键字:函数 失败 Async-Await Web 访问 资源 DispatcherTimer 运行 | 更新日期: 2023-09-27 18:35:48

我在 DispatcherTimer 上运行了一个异步 lambda 来从 Web API 获取数据。我的代码如下:

_timelineSeekTimer = new DispatcherTimer();
_timelineSeekTimer.Interval = TimeSpan.FromMilliseconds(500);
_timelineSeekTimer.Tick += async (e, o) =>
{
    var sw = new Stopwatch();
    sw.Start();
    Console.WriteLine("Init: " + sw.ElapsedMilliseconds);
    // Get HttpResponseMessage from VADAAR API
    var response = await VadaarExtensions.CenPostAsync("/viewers/" + Viewer.GetName() + "/canvases/default/renderers/01/time", "GETPAYLOAD");
    Console.WriteLine("Response Time: " + sw.ElapsedMilliseconds);
    // Extract JSON string from response
    var responseBodyAsText = await response.Content.ReadAsStringAsync();
    // Extract time value from JSON with regex @TODO: Not use regex
    var parseJsonTime = Regex.Match(responseBodyAsText, @"('d+)}").Groups[1].Value;
    ulong timeUs = ulong.Parse(parseJsonTime);
    TimelineSec = timeUs * 1e-6;
    Console.WriteLine("Current Seek Time: " + TimelineSec);
};

我的问题是计时器运行得越快,函数开始失败。下面是函数的示例输出:

Init: 0
Response Time: 14
Current Seek Time: 0.543245
<snip>
Init: 0
Response Time: 18
Current Seek Time: 8.668584
Init: 0
Init: 0
Response Time: 887
Current Seek Time: 10.553811
<snip>
Init: 0
Response Time: 885
Current Seek Time: 18.67975
Init: 0
Init: 0
Response Time: 1760
Current Seek Time: 20.56805

当对 API 使用基于浏览器的 GUI 时,响应时间在 15-30 毫秒之间。这些故障的解释是什么,为什么每次失败的响应时间都会变差?

在访问 Web 资源的 DispatcherTimer 上运行的 Async-Await 函数会定期失败

您用StopWatch测量的响应时间是不够的。这只是第一个字节的响应标头。之后,您正在阅读响应本身,这需要更多时间。定义 Intervall 小于完全响应 + 读取时间会导致网络泛洪与并行和重叠的请求,因此它变得越来越慢。