如何在c#中计算异步方法的执行时间

ahs*_*ant 6 .net c# asynchronous stopwatch async-await

所以我有一个Async方法,可以异步执行某些操作.

private async static void DoSomethingAsync (int i){}
Run Code Online (Sandbox Code Playgroud)

我把它称为循环让我说50次.

for (int i = 0; i < 50; i++)
 {
    DoSomethingAsync (i);
 }
Run Code Online (Sandbox Code Playgroud)

在循环结束时我想计算总处理时间,我使用了秒表但是你可以想象它给了我错误的时间,因为它在循环之后被调用,它不会等待DoSomethingAsync完成处理.

如何告诉秒表等待DoSomethingAsync()的所有50个实例完成.我已经看到了这个问题,但我不能在这里使用任务.

Mik*_*ike 7

我不知道为什么您不能使用Task,我的猜测是您正在Main方法之类中调用它。所以我会从那出去。

就像马丁·乌尔里希(Martin Ullrich)所说的那样,我将更改DoSomethingAsync方法以返回任务:

private async static Task DoSomethingAsync(int i)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后创建一个新方法来执行循环,方法是将方法添加到List<Task>

private static async void PerformLoop()
{
    Stopwatch timer = new Stopwatch();
    timer.Start();
    List<Task> l = new List<Task>();
    for (int i = 0; i < 50; i++)
    {
        l.Add(DoSomethingAsync(i));
    }
    await Task.WhenAll(l);
    timer.Stop();

    Console.WriteLine(timer.Elapsed.TotalSeconds);
}
Run Code Online (Sandbox Code Playgroud)

现在从您之前执行循环的位置开始,在这种情况下,该Main方法只需在其中添加新方法调用即可:

static void Main(string[] args)
{
    PerformLoop();

    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ich 5

这是使用async void. 如果不修改被调用的方法(以便它可以调用回调、解锁互斥锁等),就无法做到这一点。

您可以更改您的方法以返回async Task并创建另一个方法,该方法只调用此方法而无需等待,然后可以在您以前需要async void签名的地方使用它。