You've already forked linux-packaging-mono
Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
This commit is contained in:
parent
a569aebcfd
commit
e79aa3c0ed
@ -0,0 +1,54 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <copyright file="PageAsyncTaskManager.cs" company="Microsoft">
|
||||
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
// </copyright>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace System.Web.UI {
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
|
||||
// Handles execution of asynchronous tasks that are registered with a Page
|
||||
|
||||
internal sealed class PageAsyncTaskManager {
|
||||
|
||||
private bool _executeTasksAsyncHasCompleted = false;
|
||||
private readonly Queue<IPageAsyncTask> _registeredTasks = new Queue<IPageAsyncTask>();
|
||||
|
||||
public void EnqueueTask(IPageAsyncTask task) {
|
||||
if (_executeTasksAsyncHasCompleted) {
|
||||
// don't allow multiple calls to the execution routine
|
||||
throw new InvalidOperationException(SR.GetString(SR.PageAsyncManager_CannotEnqueue));
|
||||
}
|
||||
|
||||
_registeredTasks.Enqueue(task);
|
||||
}
|
||||
|
||||
public async Task ExecuteTasksAsync(object sender, EventArgs e, CancellationToken cancellationToken, AspNetSynchronizationContextBase syncContext, IRequestCompletedNotifier requestCompletedNotifier) {
|
||||
try {
|
||||
while (_registeredTasks.Count > 0) {
|
||||
// if canceled, propagate exception to caller and stop executing tasks
|
||||
cancellationToken.ThrowIfCancellationRequested();
|
||||
|
||||
// if request finished, stop executing tasks
|
||||
if (requestCompletedNotifier.IsRequestCompleted) {
|
||||
return;
|
||||
}
|
||||
|
||||
// execute this task
|
||||
IPageAsyncTask task = _registeredTasks.Dequeue();
|
||||
using (syncContext.AllowVoidAsyncOperationsBlock()) {
|
||||
await task.ExecuteAsync(sender, e, cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
_executeTasksAsyncHasCompleted = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user