In the following code I disable button before processing tasks and would like to enable it after all tasks are finished.
List<Task> tasks = new List<Task>();
buttonUpdateImage.Enabled = false; // disable button
foreach (OLVListItem item in cellsListView.CheckedItems)
{
Cell c = (Cell)(item.RowObject);
var task = Task.Factory.StartNew(() =>
{
Process p = new Process();
...
p.Start();
p.WaitForExit();
});
task.ContinueWith(t => c.Status = 0);
tasks.Add(task);
}
Task.WaitAll(tasks.ToArray());
// enable button here
WaitAll
is blocking the UI thread. How can I wait until all tasks finish and then enable the button?
Another way .....
the first way is better than the second, I advise you to use the first one.
First, I'd install
Microsoft.Bcl.Async
which will enable the use ofasync-await
in .NET 4.0.Now, using the answer to this question, you can asynchronously register for process exit, with no need to use
Task.Factory.StartNew
:Now, you can do this:
You can create a new task to run
WaitAll
method,just like