代码之家  ›  专栏  ›  技术社区  ›  ahsant

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

  •  5
  • ahsant  · 技术社区  · 6 年前

    所以我有一个异步方法,它异步地做一些事情。

    private async static void DoSomethingAsync (int i){}
    

    我称之为循环,比如50次。

    for (int i = 0; i < 50; i++)
     {
        DoSomethingAsync (i);
     }
    

    在循环结束时,我想计算总的处理时间,我使用了秒表,但正如您可以想象的那样,它给了我错误的时间,因为它在循环结束后立即被调用,它不会等待DoSomethingAsync完成处理。

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

    4 回复  |  直到 6 年前
        1
  •  6
  •   Mike    6 年前

    我不知道为什么你不能使用任务,我猜你是在一个主方法或其他什么方法中调用它。所以我会离开的。

    就像马丁·乌尔里希说的我会改变 DoSomethingAsync 返回任务的方法:

    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 方法只需在其中添加新方法调用:

    static void Main(string[] args)
    {
        PerformLoop();
    
        Console.ReadLine();
    }
    
        2
  •  4
  •   Martin Ullrich    6 年前

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

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

        3
  •  3
  •   TheGeneral    6 年前

    async void 为什么?别这样,用 asnyc Task ,或者 ActionBlock S或 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);
    
    }
    

    不管怎样,我认为你需要回到工作的画板上…祝你好运

        4
  •  0
  •   Dharani Kumar    6 年前

    您可以有一个全局计数器来跟踪所消耗的时间,类似这样。

    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 
    }
    
    }