C# · 12月 27, 2021

c# – 使用Async方法的秒表

我有一些代码如下: public void Start(){ var watch = new Stopwatch(); watch.Start(); Task.Factory.StartNew(MyMethod1); Task.Factory.StartNew(MyMethod2); watch.Stop(); Log(watch.ElapsedMilliseconds); Task.Factory.StartNew(MyMethod3);}

因为MyMethod1和MyMethod2被称为异步watch.Stop()在错误的时间被调用.我如何确保.Stop在MyMethod1和MyMethod2完成后被调用并记录,但确保MyMethod3不必等待.

我想在Start()方法中保留所有的Stopwatch功能,并且没有我的任何3种方法中的记录,即MyMethod1,MyMethod2和MyMethod3

解决方法 您可以使用Task.Factory.ContinueWhenAll方法. watch.Start();var t1 = Task.Factory.StartNew(MyMethod1);var t2 = Task.Factory.StartNew(MyMethod2);Task.Factory.ContinueWhenAll(new [] {t1,t2},tasks => watch.Stop());

如果您是针对.NET 4.5及更高版本,您还可以使用Task.WhenAll方法.当所有传递的任务对象完成后,它返回一个完成的任务.

Task.WhenAll(t1,t2).ContinueWith(t => watch.Stop());