c# - 测量异步代码片段的执行时间

标签 c# asynchronous async-await

我在测量异步代码片段执行时间的函数上遇到了问题,因此我创建了一个控制台应用程序以便于测试。我试图查看下载 200MB 文件所需的时间是否与程序的输出相对应。但是,在代码片段的第一条命令完成并输出“22 ms”后,应用程序立即停止执行。知道为什么会这样吗?

在我的带有 GUI 的真实应用程序中,它本质上是多线程的,测量的时间也是不切实际的。我尝试在片段中插入“Task.Delay”调用,它似乎对测量值没有影响。

为了简洁起见,我缩短了真实应用程序的代码。任何想法为什么这不起作用?关于如何衡量异步代码片段的执行时间的替代想法?

class Program
{
    static void Main(string[] args)
    {
        MainAsync().GetAwaiter().GetResult();
    }

    private static async Task MainAsync()
    {
        var httpClient = new HttpClient();

        await MeasureExecutionTimeAsync(
            async () => {
                // download a 200MB file
                var response = await httpClient.GetAsync("http://web4host.net/200MB.zip");

                // this never gets executed
                var array = await response.Content.ReadAsByteArrayAsync();
                File.WriteAllBytes("C:/mytmp/bytefile.xxx", array);
            }
        );
    }

    private static async Task MeasureExecutionTimeAsync(Action measuredAction)
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();

        await Task.Run(measuredAction);

        stopwatch.Stop();

        Console.WriteLine(stopwatch.ElapsedMilliseconds + " ms");
    }
}

最佳答案

问题似乎出在线路上

await Task.Run(measuredAction);

试试这个

private static async Task MainAsync()
    {
        var httpClient = new HttpClient();

        Func<Task> action = async () =>
        {
            var response = await httpClient.GetAsync("http://web4host.net/200MB.zip").ConfigureAwait(false);

            // this never gets executed
            var array = await response.Content.ReadAsByteArrayAsync();
            File.WriteAllBytes("C:/mytmp/bytefile.xxx", array);
            return;
        };

        await MeasureExecutionTimeAsync(action);
    }

    private static async Task MeasureExecutionTimeAsync(Func<Task> measuredAction)
    {
        var stopwatch = new Stopwatch();
        stopwatch.Start();

        await measuredAction.Invoke();

        stopwatch.Stop();

        Console.WriteLine(stopwatch.ElapsedMilliseconds + " ms");
    }

关于c# - 测量异步代码片段的执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42303984/

相关文章:

c# - 如何计算信号的过零率?

java - 将 CompletableFuture 与 @Async 一起使用会为 spring boot API 返回空响应

javascript - 我有几组 promise ,如何解析每组 "sequentially"?

c# - 异步文件保存等待不 "Await"

javascript - 没有什么等待吗?使用空的等待来分解大型同步函数

c# - 当我运行我的程序时,我在 C# 中得到 "a referral was returned from the server"

c# - 如何将Jobject追加到Jproperty的Jarray中?

c# - MailChimp MCAPI.NET - 订阅分组

grails - Grails异步响应呈现如何工作?

javascript - Node.js - 解析 XML 时方法返回 UNDEFINED