I have some code as follows:
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);
}
Because MyMethod1 and MyMethod2 are called Asynchronously watch.Stop() gets called at the wrong time. How I can ensure that .Stop gets called and logged after MyMethod1 and MyMethod2 finish BUT ensure that MyMethod3 does not have to wait.
I want to keep all Stopwatch functionality in my Start() method and not have the logging in any of my 3 methods i.e. MyMethod1, MyMethod2 and MyMethod3
You can use the
Task.Factory.ContinueWhenAll
method.If you're targeting for .NET 4.5 and upper, you can also use the method
Task.WhenAll
. It returns a task that will complete when all of the passed Task objects have completed.You need create a new Thread that will handle the logging issue. This logging thread will wait on
EventWaitHandle.WaitAll(threadsEventWaitHandles)
that will contain all the threads EventWaitHandles. Something like that :And also the methods
MyMethod1, MyMethod2
will signal to the loging thread whene they finish. Something like that :So you can ensure that MyMethod3 does not have to wait.