public void ExecuteRegisteredAsyncTasks ()
{
if ((parallelTasks == null || parallelTasks.Count == 0) &&
(serialTasks == null || serialTasks.Count == 0)){
return;
}
if (parallelTasks != null) {
DateTime startExecution = DateTime.Now;
List<PageAsyncTask> localParallelTasks = parallelTasks;
parallelTasks = null; // Shouldn't execute tasks twice
List<IAsyncResult> asyncResults = new List<IAsyncResult>();
foreach (PageAsyncTask parallelTask in localParallelTasks) {
IAsyncResult result = parallelTask.BeginHandler (this, EventArgs.Empty, new AsyncCallback (EndAsyncTaskCallback), parallelTask);
if (result.CompletedSynchronously)
parallelTask.EndHandler (result);
else
asyncResults.Add (result);
}
if (asyncResults.Count > 0) {
WaitHandle [] waitArray = new WaitHandle [asyncResults.Count];
int i = 0;
for (i = 0; i < asyncResults.Count; i++) {
waitArray [i] = asyncResults [i].AsyncWaitHandle;
}
bool allSignalled = WaitHandle.WaitAll (waitArray, AsyncTimeout, false);
if (!allSignalled) {
for (i = 0; i < asyncResults.Count; i++) {
if (!asyncResults [i].IsCompleted) {
localParallelTasks [i].TimeoutHandler (asyncResults [i]);
}
}
}
}
DateTime endWait = DateTime.Now;
TimeSpan elapsed = endWait - startExecution;
if (elapsed <= AsyncTimeout)
AsyncTimeout -= elapsed;
else
AsyncTimeout = TimeSpan.FromTicks(0);
}
if (serialTasks != null) {
List<PageAsyncTask> localSerialTasks = serialTasks;
serialTasks = null; // Shouldn't execute tasks twice
foreach (PageAsyncTask serialTask in localSerialTasks) {
DateTime startExecution = DateTime.Now;
IAsyncResult result = serialTask.BeginHandler (this, EventArgs.Empty, new AsyncCallback (EndAsyncTaskCallback), serialTask);
if (result.CompletedSynchronously)
serialTask.EndHandler (result);
else {
bool done = result.AsyncWaitHandle.WaitOne (AsyncTimeout, false);
if (!done && !result.IsCompleted) {
serialTask.TimeoutHandler (result);
}
}
DateTime endWait = DateTime.Now;
TimeSpan elapsed = endWait - startExecution;
if (elapsed <= AsyncTimeout)
AsyncTimeout -= elapsed;
else
AsyncTimeout = TimeSpan.FromTicks (0);
}
}
AsyncTimeout = TimeSpan.FromSeconds (DefaultAsyncTimeout);
}