here is sample code for starting multiple task
Task.Factory.StartNew(() =>
{
//foreach (KeyValuePair<string, string> entry in dicList)
Parallel.ForEach(dicList,
entry =>
{
//create and add the Progress in UI thread
var ucProgress = (Progress)fpPanel.Invoke(createProgress, entry);
//execute ucProgress.Process(); in non-UI thread in parallel.
//the .Process(); must update UI by using *Invoke
ucProgress.Process();
System.Threading.Thread.SpinWait(5000000);
});
});
.ContinueWith(task =>
{
//to handle exceptions use task.Exception member
var progressBar = (ProgressBar)task.AsyncState;
if (!task.IsCancelled)
{
//hide progress bar here and reset pb.Value = 0
}
},
TaskScheduler.FromCurrentSynchronizationContext() //update UI from UI thread
);
when we start multiple task using Task.Factory.StartNew()
then we can use .ContinueWith()
block to determine when each task finish. i mean ContinueWith block fire once for each task completion. so i just want to know is there any mechanism in TPL library. if i start 10 task using Task.Factory.StartNew()
so how do i notify after when 10 task will be finish. please give some insight with sample code.
You can use the WaitAll(). Example :
You can use Task.WaitAll. This call will block current thread until all tasks are finished.
Side note: you seem to be using
Task
,Parallel
andThread.SpinWait
, which makes your code complex. I would spend a bit of time analysing if that complexity is really necessary.Three options:
Task.WaitAll
call, which only returns when all the given tasks have completedTask.WhenAll
call, which returns a task which completes when all the given tasks have completed. (Introduced in .NET 4.5.)TaskFactory.ContinueWhenAll
, which adds a continuation task which will run when all the given tasks have completed.Another solution:
After the completion of all the operation inside
Parallel.For(...)
it return an onject ofParallelLoopResult
, Documentation:The
ParallelLoopResult
class has aIsCompleted
property that is set to false when aStop()
ofBreak()
method has been executed.Example:
Note that it advised to use it only when breaking or stoping the loop manually (otherwise just use
WaitAll
,WhenAll
etc).