1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
namespace System.Web.Mvc.Async {
using System;
using System.Collections.Generic;
using System.Threading;
public class AsyncManager {
private readonly SynchronizationContext _syncContext;
// default timeout is 45 sec
// from: http://msdn.microsoft.com/en-us/library/system.web.ui.page.asynctimeout.aspx
private int _timeout = 45 * 1000;
public AsyncManager()
: this(null /* syncContext */) {
}
public AsyncManager(SynchronizationContext syncContext) {
_syncContext = syncContext ?? SynchronizationContextUtil.GetSynchronizationContext();
OutstandingOperations = new OperationCounter();
OutstandingOperations.Completed += delegate { Finish(); };
Parameters = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
}
public OperationCounter OutstandingOperations {
get;
private set;
}
public IDictionary<string, object> Parameters {
get;
private set;
}
public event EventHandler Finished;
// the developer may call this function to signal that all operations are complete instead of
// waiting for the operation counter to reach zero
public virtual void Finish() {
EventHandler handler = Finished;
if (handler != null) {
handler(this, EventArgs.Empty);
}
}
// executes a callback in the current synchronization context, which gives access to HttpContext and related items
public virtual void Sync(Action action) {
_syncContext.Sync(action);
}
// measured in milliseconds, Timeout.Infinite means 'no timeout'
public int Timeout {
get {
return _timeout;
}
set {
if (value < -1) {
throw Error.AsyncCommon_InvalidTimeout("value");
}
_timeout = value;
}
}
}
}
|