异步功能的不同运行时

时间:2018-09-13 16:30:47

标签: c# function asynchronous

异步函数 foo 被调用4次,每次我们用 .Result 等待结果。

using System;
using System.Threading.Tasks;
using System.Diagnostics;

public class Program
{
    public static void Main(string[] args)
    {
        Stopwatch sm = new Stopwatch();

        sm.Start();
        var result1 = foo().Result;
        sm.Stop();
        Console.WriteLine("duration 1 : " + sm.Elapsed.ToString());

        sm.Reset();
        sm.Start();
        var result2 = foo().Result;
        sm.Stop();
        Console.WriteLine("duration 2 : " + sm.Elapsed.ToString());

        sm.Reset();
        sm.Start();
        var result3 = foo().Result;
        sm.Stop();
        Console.WriteLine("duration 3 : " + sm.Elapsed.ToString());

        sm.Reset();
        sm.Start();
        var result4 = foo().Result;
        sm.Stop();
        Console.WriteLine("duration 4 : " + sm.Elapsed.ToString());
    }

    public static async Task<int> foo()
    {
        await Task.Run(() =>
        {
            var x = 0;
            for (int i = 0; i < 100; i++)
            {
                x++;
            }
        });
        return 42;
    }
}

第一个电话比其他电话花费更多的时间,例如:

  • 持续时间1:00:00:00.0016609
  • 持续时间2:00:00:00.0001197
  • 持续时间3:00:00:00.0001045
  • 持续时间4:00:00:00.0000632

在最后一次调用之后调用另一个异步函数(例如,与foo具有相同主体的功能栏)将比第四次调用foo花费更多的时间。 是什么原因?

1 个答案:

答案 0 :(得分:0)

如注释中所提到的,当您第一次调用foo时,它会被即时编译器编译为本地代码,其他调用会执行预编译的代码,这就是它们工作更快的原因。 / p>