// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System.Threading;
namespace System.Web.Mvc.Async
{
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(StringComparer.OrdinalIgnoreCase);
}
public event EventHandler Finished;
public OperationCounter OutstandingOperations { get; private set; }
public IDictionary Parameters { get; private set; }
///
/// 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;
}
}
///
/// 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);
}
}
}