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

10

我有一个异步方法,它异步执行某些操作。

private async static void DoSomethingAsync (int i){}

我循环调用它,假设调用了50次。

for (int i = 0; i < 50; i++)
 {
    DoSomethingAsync (i);
 }
在循环结束时,我想计算总处理时间,我使用了 Stopwatch 但是正如您所想象的那样,它会在循环后立即调用,而不等待 DoSomethingAsync 处理完成,导致结果错误。请问如何让 Stopwatch 等待所有50个 DoSomethingAsync() 完成后再停止计时?我看过这个问题 ,但我无法在此处使用 Task。

4
为什么不能使用Task? - Mike
你只是启动了50个任务,却不知道它们何时完成。除非你确切地理解为什么(不)使用它们,否则避免使用“async void”。 - bommelding
4个回答

15

我不知道为什么你不能使用任务(Task),我猜测你可能是在Main方法或者其他地方调用它。那我就先离开这个问题。

如Martin Ullrich所说,我会将DoSomethingAsync方法改为返回一个任务(Task):

private async static Task DoSomethingAsync(int i)
{
    ...
}

然后创建一个新方法,通过将这些方法添加到 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);
}

现在从之前进行循环的位置,在这种情况下,Main 方法只需在其中添加新的方法调用:

现在从之前进行循环的位置,在这种情况下,Main 方法只需在其中添加新的方法调用:

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

    Console.ReadLine();
}

5
这是使用async void的缺点。如果不修改被调用的方法(以便它可以调用回调函数、解锁互斥量等),就没有办法做到这一点。
您可以将方法更改为返回async Task,然后创建另一个方法,只需调用此方法而不需要等待即可在先前需要async void签名的地方使用。

4

async void为什么不要使用?请使用asnyc Task,或者使用ActionBlocks或ParallelFor/ForEach。然而,如果你只是想尝试一下新鲜事物(而不是真正的衡量),如果你想在并行处理中计算时间,可以考虑在并行方法中放置一个计时器,并使用全局变量和Interlocked.Add Method方法来确保线程安全。

private long CombinedMs;

...

private async static void DoSomethingAsync (int i)
{

   var sw = new StopWatch();
   sw.Start();
   ...
   sw.Stop();

   Interlocked.Add(ref CombinedMs,sw.ElapsedMillisecond);

}

无论如何,我认为你需要重新考虑任务的方案...祝你好运。

0
你可以使用全局计数器来跟踪消耗的时间,类似于这样。
public class YourClass
{

TimeSpan tSpan;


public void PerformOp()
{
tSpan=new TimeSpan();
for (int i = 0; i < 50; i++)
 {
    DoSomethingAsync (i);
 }

}

private async static void DoSomethingAsync (int i)
{
Stopwatch stp = new StopWatch();
stp.Start();
//your Operation here
stp.Stop();
tSpan+=stp.Elapsed;//not the exact systax or usage but you get the idea 
}

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接