使用带有异步方法的秒表

Bob*_*Bob 11 .net c# multithreading .net-4.0 task-parallel-library

我有一些代码如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

我想在我的Start()方法中保留所有秒表功能,而不是记录我的3种方法中的任何一种,即MyMethod1,MyMethod2和MyMethod3

Ily*_*lya 20

您可以使用该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());
Run Code Online (Sandbox Code Playgroud)

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

Task.WhenAll(t1, t2).ContinueWith(t => watch.Stop());
Run Code Online (Sandbox Code Playgroud)