我有一些代码如下:
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());