我在测量异步代码片段执行时间的函数上遇到了问题,因此我创建了一个控制台应用程序以便于测试。我试图查看下载 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/