From 35bc63869b7745823b49f605ea8a3f328fdbceb5 Mon Sep 17 00:00:00 2001 From: Kerem Kat Date: Thu, 22 Nov 2012 18:57:09 +0200 Subject: [PATCH 1/9] ADO.NET profiling code mvoed to a new .NET 3.5 project. --- MiniProfiler.sln | 6 ++ Sample.Mvc/Sample.Mvc.csproj | 4 + Sample.Wcf/Sample.Wcf.csproj | 9 ++- Sample.WebForms/Sample.WebForms.csproj | 8 ++ .../Data/ExecuteType.cs | 0 .../Data/IDbProfiler.cs | 0 .../Data/Link.cs | 0 .../Data/ProfiledDbCommand.cs | 44 +++++----- .../Data/ProfiledDbConnection.cs | 0 .../Data/ProfiledDbDataAdapter.cs | 10 +-- .../Data/ProfiledDbDataReader.cs | 0 .../Data/ProfiledDbProviderFactory.cs | 0 .../Data/ProfiledDbTransaction.cs | 0 .../Data/SimpleProfiledCommand.cs | 19 ++--- .../Data/SimpleProfiledConnection.cs | 0 .../Data/SimpleProfiledDataReader.cs | 0 .../Data/SimpleProfiledTransaction.cs | 0 .../Properties/AssemblyInfo.cs | 36 +++++++++ .../StackExchange.Profiling.AdoNet.csproj | 76 ++++++++++++++++++ .../miniprofiler.snk | Bin 0 -> 596 bytes ...kExchange.Profiling.EntityFramework.csproj | 4 + .../StackExchange.Profiling.Tests.csproj | 4 + .../StackExchange.Profiling.Wcf.csproj | 4 + .../StackExchange.Profiling.csproj | 24 ++---- 24 files changed, 194 insertions(+), 54 deletions(-) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ExecuteType.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/IDbProfiler.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/Link.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbCommand.cs (83%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbConnection.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbDataAdapter.cs (97%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbDataReader.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbProviderFactory.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbTransaction.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledCommand.cs (91%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledConnection.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledDataReader.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledTransaction.cs (100%) create mode 100644 StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs create mode 100644 StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj create mode 100644 StackExchange.Profiling.AdoNet/miniprofiler.snk diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 362acfa..6cc2db5 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -32,6 +32,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StackExchange.Profiling.Wcf EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.Wcf", "Sample.Wcf\Sample.Wcf.csproj", "{2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StackExchange.Profiling.AdoNet", "StackExchange.Profiling.AdoNet\StackExchange.Profiling.AdoNet.csproj", "{44612123-B2E2-458A-859F-7077134D31C8}" +EndProject Global GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = StackExchange.Profiling.vsmdi @@ -69,6 +71,10 @@ Global {2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}.Release|Any CPU.Build.0 = Release|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sample.Mvc/Sample.Mvc.csproj b/Sample.Mvc/Sample.Mvc.csproj index 9f46673..583b040 100644 --- a/Sample.Mvc/Sample.Mvc.csproj +++ b/Sample.Mvc/Sample.Mvc.csproj @@ -190,6 +190,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {7f18dc76-61a2-4e7d-ba5a-fe159e789362} StackExchange.Profiling.EntityFramework diff --git a/Sample.Wcf/Sample.Wcf.csproj b/Sample.Wcf/Sample.Wcf.csproj index 9eb08fe..06b5b37 100644 --- a/Sample.Wcf/Sample.Wcf.csproj +++ b/Sample.Wcf/Sample.Wcf.csproj @@ -20,6 +20,10 @@ 4.0 + + + + true @@ -92,6 +96,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {C471B0E5-0AE4-48E0-A938-02AEDA030C5E} StackExchange.Profiling.Wcf @@ -126,7 +134,6 @@ False - True diff --git a/Sample.WebForms/Sample.WebForms.csproj b/Sample.WebForms/Sample.WebForms.csproj index 5518ad8..62e1301 100644 --- a/Sample.WebForms/Sample.WebForms.csproj +++ b/Sample.WebForms/Sample.WebForms.csproj @@ -20,6 +20,10 @@ 4.0 + + + + true @@ -143,6 +147,10 @@ {5D54F88D-4C79-4EAB-B7B7-C8DE78F5DDA7} Sample.Mvc + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {386222BD-6B6E-480F-A342-8DE1AB516E2C} StackExchange.Profiling diff --git a/StackExchange.Profiling/Data/ExecuteType.cs b/StackExchange.Profiling.AdoNet/Data/ExecuteType.cs similarity index 100% rename from StackExchange.Profiling/Data/ExecuteType.cs rename to StackExchange.Profiling.AdoNet/Data/ExecuteType.cs diff --git a/StackExchange.Profiling/Data/IDbProfiler.cs b/StackExchange.Profiling.AdoNet/Data/IDbProfiler.cs similarity index 100% rename from StackExchange.Profiling/Data/IDbProfiler.cs rename to StackExchange.Profiling.AdoNet/Data/IDbProfiler.cs diff --git a/StackExchange.Profiling/Data/Link.cs b/StackExchange.Profiling.AdoNet/Data/Link.cs similarity index 100% rename from StackExchange.Profiling/Data/Link.cs rename to StackExchange.Profiling.AdoNet/Data/Link.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbCommand.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbCommand.cs similarity index 83% rename from StackExchange.Profiling/Data/ProfiledDbCommand.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbCommand.cs index f7d7059..bbfb1a4 100644 --- a/StackExchange.Profiling/Data/ProfiledDbCommand.cs +++ b/StackExchange.Profiling.AdoNet/Data/ProfiledDbCommand.cs @@ -27,12 +27,12 @@ public bool BindByName get { return bindByName; } set { - if (bindByName != value) + if ( bindByName != value ) { - if (_cmd != null) + if ( _cmd != null ) { var inner = GetBindByName(_cmd.GetType()); - if (inner != null) inner(_cmd, value); + if ( inner != null ) inner(_cmd, value); } bindByName = value; } @@ -41,9 +41,9 @@ public bool BindByName static Link> bindByNameCache; static Action GetBindByName(Type commandType) { - if (commandType == null) return null; // GIGO + if ( commandType == null ) return null; // GIGO Action action; - if (Link>.TryGet(bindByNameCache, commandType, out action)) + if ( Link>.TryGet(bindByNameCache, commandType, out action) ) { return action; } @@ -51,9 +51,9 @@ static Action GetBindByName(Type commandType) action = null; ParameterInfo[] indexers; MethodInfo setter; - if (prop != null && prop.CanWrite && prop.PropertyType == typeof(bool) - && ((indexers = prop.GetIndexParameters()) == null || indexers.Length == 0) - && (setter = prop.GetSetMethod()) != null + if ( prop != null && prop.CanWrite && prop.PropertyType == typeof(bool) + && ( ( indexers = prop.GetIndexParameters() ) == null || indexers.Length == 0 ) + && ( setter = prop.GetSetMethod() ) != null ) { var method = new DynamicMethod(commandType.Name + "_BindByName", null, new Type[] { typeof(IDbCommand), typeof(bool) }); @@ -63,7 +63,7 @@ static Action GetBindByName(Type commandType) il.Emit(OpCodes.Ldarg_1); il.EmitCall(OpCodes.Callvirt, setter, null); il.Emit(OpCodes.Ret); - action = (Action)method.CreateDelegate(typeof(Action)); + action = ( Action )method.CreateDelegate(typeof(Action)); } // cache it Link>.TryAdd(ref bindByNameCache, commandType, ref action); @@ -73,12 +73,12 @@ static Action GetBindByName(Type commandType) public ProfiledDbCommand(DbCommand cmd, DbConnection conn, IDbProfiler profiler) { - if (cmd == null) throw new ArgumentNullException("cmd"); + if ( cmd == null ) throw new ArgumentNullException("cmd"); _cmd = cmd; _conn = conn; - if (profiler != null) + if ( profiler != null ) { _profiler = profiler; } @@ -109,10 +109,10 @@ protected override DbConnection DbConnection { // TODO: we need a way to grab the IDbProfiler which may not be the same as the MiniProfiler, it could be wrapped // allow for command reuse, it is clear the connection is going to need to be reset - if (MiniProfiler.Current != null) + /* TODO: abstract out. if (MiniProfiler.Current != null) { _profiler = MiniProfiler.Current; - } + }*/ _conn = value; var awesomeConn = value as ProfiledDbConnection; @@ -151,7 +151,7 @@ public override UpdateRowSource UpdatedRowSource protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return _cmd.ExecuteReader(behavior); } @@ -163,7 +163,7 @@ protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) result = _cmd.ExecuteReader(behavior); result = new ProfiledDbDataReader(result, _conn, _profiler); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, ExecuteType.Reader, e); throw; @@ -177,7 +177,7 @@ protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) public override int ExecuteNonQuery() { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return _cmd.ExecuteNonQuery(); } @@ -189,7 +189,7 @@ public override int ExecuteNonQuery() { result = _cmd.ExecuteNonQuery(); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, ExecuteType.NonQuery, e); throw; @@ -203,7 +203,7 @@ public override int ExecuteNonQuery() public override object ExecuteScalar() { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return _cmd.ExecuteScalar(); } @@ -214,7 +214,7 @@ public override object ExecuteScalar() { result = _cmd.ExecuteScalar(); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, ExecuteType.Scalar, e); throw; @@ -243,7 +243,7 @@ protected override DbParameter CreateDbParameter() protected override void Dispose(bool disposing) { - if (disposing && _cmd != null) + if ( disposing && _cmd != null ) { _cmd.Dispose(); } @@ -257,8 +257,8 @@ protected override void Dispose(bool disposing) public ProfiledDbCommand Clone() { // EF expects ICloneable ICloneable tail = _cmd as ICloneable; - if (tail == null) throw new NotSupportedException("Underlying " + _cmd.GetType().Name + " is not cloneable"); - return new ProfiledDbCommand((DbCommand)tail.Clone(), _conn, _profiler); + if ( tail == null ) throw new NotSupportedException("Underlying " + _cmd.GetType().Name + " is not cloneable"); + return new ProfiledDbCommand(( DbCommand )tail.Clone(), _conn, _profiler); } object ICloneable.Clone() { return Clone(); } diff --git a/StackExchange.Profiling/Data/ProfiledDbConnection.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbConnection.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbConnection.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbConnection.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbDataAdapter.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbDataAdapter.cs similarity index 97% rename from StackExchange.Profiling/Data/ProfiledDbDataAdapter.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbDataAdapter.cs index 17c9aaf..7494c99 100644 --- a/StackExchange.Profiling/Data/ProfiledDbDataAdapter.cs +++ b/StackExchange.Profiling.AdoNet/Data/ProfiledDbDataAdapter.cs @@ -37,13 +37,13 @@ public IDbDataAdapter InternalAdapter /// The profiler instance or null to get the current instance. public ProfiledDbDataAdapter(IDbDataAdapter wrappedAdapter, IDbProfiler profiler = null) { - if (wrappedAdapter == null) + if ( wrappedAdapter == null ) { throw new ArgumentNullException("wrappedAdapter"); } _adapter = wrappedAdapter; - _profiler = profiler ?? MiniProfiler.Current; + _profiler = profiler; /* TODO: abstract out. ?? MiniProfiler.Current; */ } /// @@ -78,19 +78,19 @@ public int Fill(DataSet dataSet) * SqlDataAdapter type and would thus work fine with this workaround. */ - if (_profiler == null || !_profiler.IsActive || !(_selectCommand is DbCommand)) + if ( _profiler == null || !_profiler.IsActive || !( _selectCommand is DbCommand ) ) { return _adapter.Fill(dataSet); } int result; - var cmd = (DbCommand)_selectCommand; + var cmd = ( DbCommand )_selectCommand; _profiler.ExecuteStart(cmd, ExecuteType.Reader); try { result = _adapter.Fill(dataSet); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(cmd, ExecuteType.Reader, e); throw; diff --git a/StackExchange.Profiling/Data/ProfiledDbDataReader.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbDataReader.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbDataReader.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbDataReader.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbProviderFactory.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbProviderFactory.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbProviderFactory.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbProviderFactory.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbTransaction.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbTransaction.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbTransaction.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbTransaction.cs diff --git a/StackExchange.Profiling/Data/SimpleProfiledCommand.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledCommand.cs similarity index 91% rename from StackExchange.Profiling/Data/SimpleProfiledCommand.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledCommand.cs index 553ee50..1d29500 100644 --- a/StackExchange.Profiling/Data/SimpleProfiledCommand.cs +++ b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledCommand.cs @@ -23,12 +23,12 @@ public class SimpleProfiledCommand : IDbCommand, ICloneable /// The profiler to use public SimpleProfiledCommand(IDbCommand command, IDbConnection connection, IDbProfiler profiler) { - if (command == null) throw new ArgumentNullException("command"); + if ( command == null ) throw new ArgumentNullException("command"); _command = command; _connection = connection; - if (profiler != null) + if ( profiler != null ) { _profiler = profiler; } @@ -73,7 +73,7 @@ public object ExecuteScalar() private TResult ProfileWith(ExecuteType type, Func func) { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return func(); } @@ -84,7 +84,7 @@ private TResult ProfileWith(ExecuteType type, Func func) { result = func(); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, type, e); throw; @@ -101,10 +101,11 @@ public IDbConnection Connection get { return _connection; } set { + /* TODO: abstract out. if (MiniProfiler.Current != null) { _profiler = MiniProfiler.Current; - } + }*/ _connection = value; @@ -162,7 +163,7 @@ public void Dispose() protected virtual void Dispose(bool disposing) { - if (disposing && _command != null) _command.Dispose(); + if ( disposing && _command != null ) _command.Dispose(); _command = null; _connection = null; @@ -172,10 +173,10 @@ protected virtual void Dispose(bool disposing) public object Clone() { var tail = _command as ICloneable; - if (tail == null) + if ( tail == null ) throw new NotSupportedException("Underlying " + _command.GetType().Name + " is not cloneable."); - return new SimpleProfiledCommand((IDbCommand)tail.Clone(), _connection, _profiler); + return new SimpleProfiledCommand(( IDbCommand )tail.Clone(), _connection, _profiler); } - } + } } diff --git a/StackExchange.Profiling/Data/SimpleProfiledConnection.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledConnection.cs similarity index 100% rename from StackExchange.Profiling/Data/SimpleProfiledConnection.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledConnection.cs diff --git a/StackExchange.Profiling/Data/SimpleProfiledDataReader.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledDataReader.cs similarity index 100% rename from StackExchange.Profiling/Data/SimpleProfiledDataReader.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledDataReader.cs diff --git a/StackExchange.Profiling/Data/SimpleProfiledTransaction.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledTransaction.cs similarity index 100% rename from StackExchange.Profiling/Data/SimpleProfiledTransaction.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledTransaction.cs diff --git a/StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs b/StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d4bf406 --- /dev/null +++ b/StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("StackExchange.Profiling.AdoNet")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("StackExchange.Profiling.AdoNet")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4abed657-6ea3-4e10-a2b2-37efef1eb7a3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj b/StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj new file mode 100644 index 0000000..4618e1f --- /dev/null +++ b/StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj @@ -0,0 +1,76 @@ + + + + + Debug + AnyCPU + {44612123-B2E2-458A-859F-7077134D31C8} + Library + Properties + StackExchange.Profiling.AdoNet + StackExchange.Profiling.AdoNet + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + miniprofiler.snk + + + + + + + + + + + + + + + + + + Component + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StackExchange.Profiling.AdoNet/miniprofiler.snk b/StackExchange.Profiling.AdoNet/miniprofiler.snk new file mode 100644 index 0000000000000000000000000000000000000000..f11e395bf968b2c00be2f07180119fa12f90ff9d GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097LD$749s)XVi%pO@Ulv{KrTAIS~gW2vRoaOW20SypS`$Ko7zBKYcK0_ zv`aE3RU(d_NW*_NW;zZptU%F#kMfEW{M%w4pgp{;jR9>R-Cx-n6L-0RO5#8{ukzKU zh+0xc^DL;;I~L#0DnoSNZ?km2??#064Q5kmCiV8rQ_ci&#z`=y_;6Q#U}lBpL~NA+ zLF7qen2R)v{`~iKE9;oIr#3D<@CS}+74aWIIEb3D)HwvKDT0nn8SL9~sNqMXMcWYC zMq+Xk>9!&n|2P^y;TeLq436kgDBRq&`49EQU>szN51L<9DErGD_~WmqKW3$ip@rQG zEJHY4YhQ;#>ex>(H*2k1K6QuzvJ_y?o%nPm4b-=TE>9_i{H(7Zk!>Qr5q?Vo39&wf zIJL39wHwu83JO>YoS3AQeh;nR%U($c9%UGM#dm_Xtl^lZjJ0y}{nyyU(diRQ)9HNc z&E^Vzb=Z2^oX}z98T`wo3cWO(F02$p59uwoYgVFTwCZL*vu?qe=Z~LdPLYn z-Ti4EIBd!1Te)QMYykxQ-Z8X{0{zqHn9a~FHs2BUcXpRQZCbi_m&96`L{g48$q7>B imLG}@zxqDj%ow6r!x&%}bil#x#(aWEck)Ee5-*h51SU5C literal 0 HcmV?d00001 diff --git a/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj b/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj index 7a84f25..ad689fe 100644 --- a/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj +++ b/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj @@ -71,6 +71,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {386222BD-6B6E-480F-A342-8DE1AB516E2C} StackExchange.Profiling diff --git a/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj b/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj index 4aff84c..33bfa49 100644 --- a/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj +++ b/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj @@ -84,6 +84,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {7F18DC76-61A2-4E7D-BA5A-FE159E789362} StackExchange.Profiling.EntityFramework diff --git a/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj b/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj index b26e330..f0331f1 100644 --- a/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj +++ b/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj @@ -68,6 +68,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {386222BD-6B6E-480F-A342-8DE1AB516E2C} StackExchange.Profiling diff --git a/StackExchange.Profiling/StackExchange.Profiling.csproj b/StackExchange.Profiling/StackExchange.Profiling.csproj index 72e1a84..8c852d9 100644 --- a/StackExchange.Profiling/StackExchange.Profiling.csproj +++ b/StackExchange.Profiling/StackExchange.Profiling.csproj @@ -63,24 +63,9 @@ IProfilerProvider.cs - - - - - - - Component - - - Code - - - - - @@ -146,7 +131,12 @@ - + + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + + @@ -169,4 +159,4 @@ --> - + \ No newline at end of file From e9b1442419ef6492584c0f1164982889ceb93fb2 Mon Sep 17 00:00:00 2001 From: Kerem Kat Date: Thu, 22 Nov 2012 18:57:09 +0200 Subject: [PATCH 2/9] ADO.NET profiling code mvoed to a new .NET 3.5 project. --- MiniProfiler.sln | 6 ++ Readme.md | 4 +- Sample.Mvc/Sample.Mvc.csproj | 4 + Sample.Wcf/Sample.Wcf.csproj | 9 ++- Sample.WebForms/Sample.WebForms.csproj | 8 ++ .../Data/ExecuteType.cs | 0 .../Data/IDbProfiler.cs | 0 .../Data/Link.cs | 0 .../Data/ProfiledDbCommand.cs | 44 +++++----- .../Data/ProfiledDbConnection.cs | 0 .../Data/ProfiledDbDataAdapter.cs | 10 +-- .../Data/ProfiledDbDataReader.cs | 0 .../Data/ProfiledDbProviderFactory.cs | 0 .../Data/ProfiledDbTransaction.cs | 0 .../Data/SimpleProfiledCommand.cs | 19 ++--- .../Data/SimpleProfiledConnection.cs | 0 .../Data/SimpleProfiledDataReader.cs | 0 .../Data/SimpleProfiledTransaction.cs | 0 .../Properties/AssemblyInfo.cs | 36 +++++++++ .../StackExchange.Profiling.AdoNet.csproj | 76 ++++++++++++++++++ .../miniprofiler.snk | Bin 0 -> 596 bytes ...kExchange.Profiling.EntityFramework.csproj | 4 + .../StackExchange.Profiling.Tests.csproj | 4 + .../StackExchange.Profiling.Wcf.csproj | 4 + .../StackExchange.Profiling.csproj | 24 ++---- 25 files changed, 197 insertions(+), 55 deletions(-) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ExecuteType.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/IDbProfiler.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/Link.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbCommand.cs (83%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbConnection.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbDataAdapter.cs (97%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbDataReader.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbProviderFactory.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/ProfiledDbTransaction.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledCommand.cs (91%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledConnection.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledDataReader.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling.AdoNet}/Data/SimpleProfiledTransaction.cs (100%) create mode 100644 StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs create mode 100644 StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj create mode 100644 StackExchange.Profiling.AdoNet/miniprofiler.snk diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 362acfa..6cc2db5 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -32,6 +32,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StackExchange.Profiling.Wcf EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.Wcf", "Sample.Wcf\Sample.Wcf.csproj", "{2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StackExchange.Profiling.AdoNet", "StackExchange.Profiling.AdoNet\StackExchange.Profiling.AdoNet.csproj", "{44612123-B2E2-458A-859F-7077134D31C8}" +EndProject Global GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = StackExchange.Profiling.vsmdi @@ -69,6 +71,10 @@ Global {2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}.Debug|Any CPU.Build.0 = Debug|Any CPU {2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}.Release|Any CPU.ActiveCfg = Release|Any CPU {2DD1E352-3FFE-49F8-ADAB-65F3FECE75E6}.Release|Any CPU.Build.0 = Release|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {44612123-B2E2-458A-859F-7077134D31C8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Readme.md b/Readme.md index 471aad0..2633c38 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,6 @@ -This official clone of Mini Profiler +This is a fork of the official clone of Mini Profiler + +This fork refactors ADO.NET profiling classes to a .NET 3.5 project. New StackExchange.Profiling.AdoNet could be used from other .NET projects. We accept patches and pull requests here. diff --git a/Sample.Mvc/Sample.Mvc.csproj b/Sample.Mvc/Sample.Mvc.csproj index 9f46673..583b040 100644 --- a/Sample.Mvc/Sample.Mvc.csproj +++ b/Sample.Mvc/Sample.Mvc.csproj @@ -190,6 +190,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {7f18dc76-61a2-4e7d-ba5a-fe159e789362} StackExchange.Profiling.EntityFramework diff --git a/Sample.Wcf/Sample.Wcf.csproj b/Sample.Wcf/Sample.Wcf.csproj index 9eb08fe..06b5b37 100644 --- a/Sample.Wcf/Sample.Wcf.csproj +++ b/Sample.Wcf/Sample.Wcf.csproj @@ -20,6 +20,10 @@ 4.0 + + + + true @@ -92,6 +96,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {C471B0E5-0AE4-48E0-A938-02AEDA030C5E} StackExchange.Profiling.Wcf @@ -126,7 +134,6 @@ False - True diff --git a/Sample.WebForms/Sample.WebForms.csproj b/Sample.WebForms/Sample.WebForms.csproj index 5518ad8..62e1301 100644 --- a/Sample.WebForms/Sample.WebForms.csproj +++ b/Sample.WebForms/Sample.WebForms.csproj @@ -20,6 +20,10 @@ 4.0 + + + + true @@ -143,6 +147,10 @@ {5D54F88D-4C79-4EAB-B7B7-C8DE78F5DDA7} Sample.Mvc + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {386222BD-6B6E-480F-A342-8DE1AB516E2C} StackExchange.Profiling diff --git a/StackExchange.Profiling/Data/ExecuteType.cs b/StackExchange.Profiling.AdoNet/Data/ExecuteType.cs similarity index 100% rename from StackExchange.Profiling/Data/ExecuteType.cs rename to StackExchange.Profiling.AdoNet/Data/ExecuteType.cs diff --git a/StackExchange.Profiling/Data/IDbProfiler.cs b/StackExchange.Profiling.AdoNet/Data/IDbProfiler.cs similarity index 100% rename from StackExchange.Profiling/Data/IDbProfiler.cs rename to StackExchange.Profiling.AdoNet/Data/IDbProfiler.cs diff --git a/StackExchange.Profiling/Data/Link.cs b/StackExchange.Profiling.AdoNet/Data/Link.cs similarity index 100% rename from StackExchange.Profiling/Data/Link.cs rename to StackExchange.Profiling.AdoNet/Data/Link.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbCommand.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbCommand.cs similarity index 83% rename from StackExchange.Profiling/Data/ProfiledDbCommand.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbCommand.cs index f7d7059..bbfb1a4 100644 --- a/StackExchange.Profiling/Data/ProfiledDbCommand.cs +++ b/StackExchange.Profiling.AdoNet/Data/ProfiledDbCommand.cs @@ -27,12 +27,12 @@ public bool BindByName get { return bindByName; } set { - if (bindByName != value) + if ( bindByName != value ) { - if (_cmd != null) + if ( _cmd != null ) { var inner = GetBindByName(_cmd.GetType()); - if (inner != null) inner(_cmd, value); + if ( inner != null ) inner(_cmd, value); } bindByName = value; } @@ -41,9 +41,9 @@ public bool BindByName static Link> bindByNameCache; static Action GetBindByName(Type commandType) { - if (commandType == null) return null; // GIGO + if ( commandType == null ) return null; // GIGO Action action; - if (Link>.TryGet(bindByNameCache, commandType, out action)) + if ( Link>.TryGet(bindByNameCache, commandType, out action) ) { return action; } @@ -51,9 +51,9 @@ static Action GetBindByName(Type commandType) action = null; ParameterInfo[] indexers; MethodInfo setter; - if (prop != null && prop.CanWrite && prop.PropertyType == typeof(bool) - && ((indexers = prop.GetIndexParameters()) == null || indexers.Length == 0) - && (setter = prop.GetSetMethod()) != null + if ( prop != null && prop.CanWrite && prop.PropertyType == typeof(bool) + && ( ( indexers = prop.GetIndexParameters() ) == null || indexers.Length == 0 ) + && ( setter = prop.GetSetMethod() ) != null ) { var method = new DynamicMethod(commandType.Name + "_BindByName", null, new Type[] { typeof(IDbCommand), typeof(bool) }); @@ -63,7 +63,7 @@ static Action GetBindByName(Type commandType) il.Emit(OpCodes.Ldarg_1); il.EmitCall(OpCodes.Callvirt, setter, null); il.Emit(OpCodes.Ret); - action = (Action)method.CreateDelegate(typeof(Action)); + action = ( Action )method.CreateDelegate(typeof(Action)); } // cache it Link>.TryAdd(ref bindByNameCache, commandType, ref action); @@ -73,12 +73,12 @@ static Action GetBindByName(Type commandType) public ProfiledDbCommand(DbCommand cmd, DbConnection conn, IDbProfiler profiler) { - if (cmd == null) throw new ArgumentNullException("cmd"); + if ( cmd == null ) throw new ArgumentNullException("cmd"); _cmd = cmd; _conn = conn; - if (profiler != null) + if ( profiler != null ) { _profiler = profiler; } @@ -109,10 +109,10 @@ protected override DbConnection DbConnection { // TODO: we need a way to grab the IDbProfiler which may not be the same as the MiniProfiler, it could be wrapped // allow for command reuse, it is clear the connection is going to need to be reset - if (MiniProfiler.Current != null) + /* TODO: abstract out. if (MiniProfiler.Current != null) { _profiler = MiniProfiler.Current; - } + }*/ _conn = value; var awesomeConn = value as ProfiledDbConnection; @@ -151,7 +151,7 @@ public override UpdateRowSource UpdatedRowSource protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return _cmd.ExecuteReader(behavior); } @@ -163,7 +163,7 @@ protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) result = _cmd.ExecuteReader(behavior); result = new ProfiledDbDataReader(result, _conn, _profiler); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, ExecuteType.Reader, e); throw; @@ -177,7 +177,7 @@ protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) public override int ExecuteNonQuery() { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return _cmd.ExecuteNonQuery(); } @@ -189,7 +189,7 @@ public override int ExecuteNonQuery() { result = _cmd.ExecuteNonQuery(); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, ExecuteType.NonQuery, e); throw; @@ -203,7 +203,7 @@ public override int ExecuteNonQuery() public override object ExecuteScalar() { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return _cmd.ExecuteScalar(); } @@ -214,7 +214,7 @@ public override object ExecuteScalar() { result = _cmd.ExecuteScalar(); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, ExecuteType.Scalar, e); throw; @@ -243,7 +243,7 @@ protected override DbParameter CreateDbParameter() protected override void Dispose(bool disposing) { - if (disposing && _cmd != null) + if ( disposing && _cmd != null ) { _cmd.Dispose(); } @@ -257,8 +257,8 @@ protected override void Dispose(bool disposing) public ProfiledDbCommand Clone() { // EF expects ICloneable ICloneable tail = _cmd as ICloneable; - if (tail == null) throw new NotSupportedException("Underlying " + _cmd.GetType().Name + " is not cloneable"); - return new ProfiledDbCommand((DbCommand)tail.Clone(), _conn, _profiler); + if ( tail == null ) throw new NotSupportedException("Underlying " + _cmd.GetType().Name + " is not cloneable"); + return new ProfiledDbCommand(( DbCommand )tail.Clone(), _conn, _profiler); } object ICloneable.Clone() { return Clone(); } diff --git a/StackExchange.Profiling/Data/ProfiledDbConnection.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbConnection.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbConnection.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbConnection.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbDataAdapter.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbDataAdapter.cs similarity index 97% rename from StackExchange.Profiling/Data/ProfiledDbDataAdapter.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbDataAdapter.cs index 17c9aaf..7494c99 100644 --- a/StackExchange.Profiling/Data/ProfiledDbDataAdapter.cs +++ b/StackExchange.Profiling.AdoNet/Data/ProfiledDbDataAdapter.cs @@ -37,13 +37,13 @@ public IDbDataAdapter InternalAdapter /// The profiler instance or null to get the current instance. public ProfiledDbDataAdapter(IDbDataAdapter wrappedAdapter, IDbProfiler profiler = null) { - if (wrappedAdapter == null) + if ( wrappedAdapter == null ) { throw new ArgumentNullException("wrappedAdapter"); } _adapter = wrappedAdapter; - _profiler = profiler ?? MiniProfiler.Current; + _profiler = profiler; /* TODO: abstract out. ?? MiniProfiler.Current; */ } /// @@ -78,19 +78,19 @@ public int Fill(DataSet dataSet) * SqlDataAdapter type and would thus work fine with this workaround. */ - if (_profiler == null || !_profiler.IsActive || !(_selectCommand is DbCommand)) + if ( _profiler == null || !_profiler.IsActive || !( _selectCommand is DbCommand ) ) { return _adapter.Fill(dataSet); } int result; - var cmd = (DbCommand)_selectCommand; + var cmd = ( DbCommand )_selectCommand; _profiler.ExecuteStart(cmd, ExecuteType.Reader); try { result = _adapter.Fill(dataSet); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(cmd, ExecuteType.Reader, e); throw; diff --git a/StackExchange.Profiling/Data/ProfiledDbDataReader.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbDataReader.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbDataReader.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbDataReader.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbProviderFactory.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbProviderFactory.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbProviderFactory.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbProviderFactory.cs diff --git a/StackExchange.Profiling/Data/ProfiledDbTransaction.cs b/StackExchange.Profiling.AdoNet/Data/ProfiledDbTransaction.cs similarity index 100% rename from StackExchange.Profiling/Data/ProfiledDbTransaction.cs rename to StackExchange.Profiling.AdoNet/Data/ProfiledDbTransaction.cs diff --git a/StackExchange.Profiling/Data/SimpleProfiledCommand.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledCommand.cs similarity index 91% rename from StackExchange.Profiling/Data/SimpleProfiledCommand.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledCommand.cs index 553ee50..1d29500 100644 --- a/StackExchange.Profiling/Data/SimpleProfiledCommand.cs +++ b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledCommand.cs @@ -23,12 +23,12 @@ public class SimpleProfiledCommand : IDbCommand, ICloneable /// The profiler to use public SimpleProfiledCommand(IDbCommand command, IDbConnection connection, IDbProfiler profiler) { - if (command == null) throw new ArgumentNullException("command"); + if ( command == null ) throw new ArgumentNullException("command"); _command = command; _connection = connection; - if (profiler != null) + if ( profiler != null ) { _profiler = profiler; } @@ -73,7 +73,7 @@ public object ExecuteScalar() private TResult ProfileWith(ExecuteType type, Func func) { - if (_profiler == null || !_profiler.IsActive) + if ( _profiler == null || !_profiler.IsActive ) { return func(); } @@ -84,7 +84,7 @@ private TResult ProfileWith(ExecuteType type, Func func) { result = func(); } - catch (Exception e) + catch ( Exception e ) { _profiler.OnError(this, type, e); throw; @@ -101,10 +101,11 @@ public IDbConnection Connection get { return _connection; } set { + /* TODO: abstract out. if (MiniProfiler.Current != null) { _profiler = MiniProfiler.Current; - } + }*/ _connection = value; @@ -162,7 +163,7 @@ public void Dispose() protected virtual void Dispose(bool disposing) { - if (disposing && _command != null) _command.Dispose(); + if ( disposing && _command != null ) _command.Dispose(); _command = null; _connection = null; @@ -172,10 +173,10 @@ protected virtual void Dispose(bool disposing) public object Clone() { var tail = _command as ICloneable; - if (tail == null) + if ( tail == null ) throw new NotSupportedException("Underlying " + _command.GetType().Name + " is not cloneable."); - return new SimpleProfiledCommand((IDbCommand)tail.Clone(), _connection, _profiler); + return new SimpleProfiledCommand(( IDbCommand )tail.Clone(), _connection, _profiler); } - } + } } diff --git a/StackExchange.Profiling/Data/SimpleProfiledConnection.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledConnection.cs similarity index 100% rename from StackExchange.Profiling/Data/SimpleProfiledConnection.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledConnection.cs diff --git a/StackExchange.Profiling/Data/SimpleProfiledDataReader.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledDataReader.cs similarity index 100% rename from StackExchange.Profiling/Data/SimpleProfiledDataReader.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledDataReader.cs diff --git a/StackExchange.Profiling/Data/SimpleProfiledTransaction.cs b/StackExchange.Profiling.AdoNet/Data/SimpleProfiledTransaction.cs similarity index 100% rename from StackExchange.Profiling/Data/SimpleProfiledTransaction.cs rename to StackExchange.Profiling.AdoNet/Data/SimpleProfiledTransaction.cs diff --git a/StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs b/StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d4bf406 --- /dev/null +++ b/StackExchange.Profiling.AdoNet/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("StackExchange.Profiling.AdoNet")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("StackExchange.Profiling.AdoNet")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4abed657-6ea3-4e10-a2b2-37efef1eb7a3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj b/StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj new file mode 100644 index 0000000..4618e1f --- /dev/null +++ b/StackExchange.Profiling.AdoNet/StackExchange.Profiling.AdoNet.csproj @@ -0,0 +1,76 @@ + + + + + Debug + AnyCPU + {44612123-B2E2-458A-859F-7077134D31C8} + Library + Properties + StackExchange.Profiling.AdoNet + StackExchange.Profiling.AdoNet + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + miniprofiler.snk + + + + + + + + + + + + + + + + + + Component + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StackExchange.Profiling.AdoNet/miniprofiler.snk b/StackExchange.Profiling.AdoNet/miniprofiler.snk new file mode 100644 index 0000000000000000000000000000000000000000..f11e395bf968b2c00be2f07180119fa12f90ff9d GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50097LD$749s)XVi%pO@Ulv{KrTAIS~gW2vRoaOW20SypS`$Ko7zBKYcK0_ zv`aE3RU(d_NW*_NW;zZptU%F#kMfEW{M%w4pgp{;jR9>R-Cx-n6L-0RO5#8{ukzKU zh+0xc^DL;;I~L#0DnoSNZ?km2??#064Q5kmCiV8rQ_ci&#z`=y_;6Q#U}lBpL~NA+ zLF7qen2R)v{`~iKE9;oIr#3D<@CS}+74aWIIEb3D)HwvKDT0nn8SL9~sNqMXMcWYC zMq+Xk>9!&n|2P^y;TeLq436kgDBRq&`49EQU>szN51L<9DErGD_~WmqKW3$ip@rQG zEJHY4YhQ;#>ex>(H*2k1K6QuzvJ_y?o%nPm4b-=TE>9_i{H(7Zk!>Qr5q?Vo39&wf zIJL39wHwu83JO>YoS3AQeh;nR%U($c9%UGM#dm_Xtl^lZjJ0y}{nyyU(diRQ)9HNc z&E^Vzb=Z2^oX}z98T`wo3cWO(F02$p59uwoYgVFTwCZL*vu?qe=Z~LdPLYn z-Ti4EIBd!1Te)QMYykxQ-Z8X{0{zqHn9a~FHs2BUcXpRQZCbi_m&96`L{g48$q7>B imLG}@zxqDj%ow6r!x&%}bil#x#(aWEck)Ee5-*h51SU5C literal 0 HcmV?d00001 diff --git a/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj b/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj index 7a84f25..ad689fe 100644 --- a/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj +++ b/StackExchange.Profiling.EntityFramework/StackExchange.Profiling.EntityFramework.csproj @@ -71,6 +71,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {386222BD-6B6E-480F-A342-8DE1AB516E2C} StackExchange.Profiling diff --git a/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj b/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj index 4aff84c..33bfa49 100644 --- a/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj +++ b/StackExchange.Profiling.Tests/StackExchange.Profiling.Tests.csproj @@ -84,6 +84,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {7F18DC76-61A2-4E7D-BA5A-FE159E789362} StackExchange.Profiling.EntityFramework diff --git a/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj b/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj index b26e330..f0331f1 100644 --- a/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj +++ b/StackExchange.Profiling.Wcf/StackExchange.Profiling.Wcf.csproj @@ -68,6 +68,10 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + {386222BD-6B6E-480F-A342-8DE1AB516E2C} StackExchange.Profiling diff --git a/StackExchange.Profiling/StackExchange.Profiling.csproj b/StackExchange.Profiling/StackExchange.Profiling.csproj index 72e1a84..8c852d9 100644 --- a/StackExchange.Profiling/StackExchange.Profiling.csproj +++ b/StackExchange.Profiling/StackExchange.Profiling.csproj @@ -63,24 +63,9 @@ IProfilerProvider.cs - - - - - - - Component - - - Code - - - - - @@ -146,7 +131,12 @@ - + + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + + @@ -169,4 +159,4 @@ --> - + \ No newline at end of file From fbd847ba492342c6a0cfc6c857316d88509ca996 Mon Sep 17 00:00:00 2001 From: Kerem KAT Date: Sat, 8 Dec 2012 14:13:59 +0200 Subject: [PATCH 3/9] StackExchange.Profiling35 project added. --- MiniProfiler.sln | 12 + Sample.Mvc/Sample.Mvc.csproj | 4 + Sample.Wcf/Sample.Wcf.csproj | 4 + Sample.WebForms-NET35/About.aspx | 13 + Sample.WebForms-NET35/About.aspx.cs | 17 + Sample.WebForms-NET35/About.aspx.designer.cs | 15 + .../Account/ChangePassword.aspx | 60 + .../Account/ChangePassword.aspx.cs | 17 + .../Account/ChangePassword.aspx.designer.cs | 26 + .../Account/ChangePasswordSuccess.aspx | 13 + .../Account/ChangePasswordSuccess.aspx.cs | 17 + .../ChangePasswordSuccess.aspx.designer.cs | 17 + Sample.WebForms-NET35/Account/Login.aspx | 51 + Sample.WebForms-NET35/Account/Login.aspx.cs | 17 + .../Account/Login.aspx.designer.cs | 26 + Sample.WebForms-NET35/Account/Register.aspx | 75 + .../Account/Register.aspx.cs | 32 + .../Account/Register.aspx.designer.cs | 35 + Sample.WebForms-NET35/Account/Web.config | 18 + Sample.WebForms-NET35/Default.aspx | 26 + Sample.WebForms-NET35/Default.aspx.cs | 23 + .../Default.aspx.designer.cs | 15 + Sample.WebForms-NET35/Global.asax | 1 + Sample.WebForms-NET35/Global.asax.cs | 62 + .../Properties/AssemblyInfo.cs | 35 + .../Sample.WebForms-NET35.csproj | 178 + .../Scripts/jquery-1.7.1.intellisense.js | 2521 ++ Sample.WebForms-NET35/Scripts/jquery-1.7.1.js | 9266 ++++++++ .../Scripts/jquery-1.7.1.min.js | 4 + Sample.WebForms-NET35/Site.Master | 59 + Sample.WebForms-NET35/Site.Master.cs | 17 + Sample.WebForms-NET35/Site.Master.designer.cs | 51 + Sample.WebForms-NET35/Styles/Site.css | 294 + Sample.WebForms-NET35/Web.Debug.config | 30 + Sample.WebForms-NET35/Web.Release.config | 31 + Sample.WebForms-NET35/Web.config | 55 + Sample.WebForms/Sample.WebForms.csproj | 4 + ...kExchange.Profiling.EntityFramework.csproj | 4 + .../StackExchange.Profiling.Tests.csproj | 4 + .../StackExchange.Profiling.Wcf.csproj | 4 + StackExchange.Profiling/ClientTimingHelper.cs | 69 - .../Helpers/ExtensionMethods.cs | 4 +- .../Helpers/StackTraceSnippet.cs | 74 - .../StackExchange.Profiling.csproj | 47 +- .../WebRequestProfilerProvider.cs | 140 +- .../BaseProfilerProvider.cs | 0 .../ClientTimings.cs | 16 +- .../Helpers/ExtensionMethods.cs | 72 + .../Helpers/HaackFormatter.cs | 0 .../Helpers/IStopWatch.cs | 1 - .../Helpers/StackTraceSnippet.cs | 74 + StackExchange.Profiling35/Helpers/Tuples.cs | 57 + .../IProfilerProvider.cs | 0 .../IUserProvider.cs | 0 .../IpAddressProvider.cs | 0 .../MiniProfiler.IDbProfiler.cs | 0 .../MiniProfiler.Settings.cs | 8 +- .../MiniProfiler.cs | 24 +- .../Properties/AssemblyInfo.cs | 19 + .../SqlFormatters/ISqlFormatter.cs | 0 .../SqlFormatters/InlineFormatter.cs | 0 .../SqlFormatters/OracleFormatter.cs | 22 +- .../SqlFormatters/SqlServerFormatter.cs | 9 +- .../SqlProfiler.cs | 1 + .../SqlTiming.cs | 8 +- .../SqlTimingParameter.cs | 0 .../StackExchange.Profiling35.csproj | 146 + .../Storage/DatabaseStorageBase.cs | 0 .../Storage/HttpRuntimeCacheStorage.cs | 0 .../Storage/IStorage.cs | 0 .../Timing.cs | 2 +- .../UI/MiniProfilerHandler.cs | 76 +- .../UI/include.partial.html | 1 + StackExchange.Profiling35/UI/includes.css | 1 + StackExchange.Profiling35/UI/includes.js | 897 + StackExchange.Profiling35/UI/includes.less | 468 + StackExchange.Profiling35/UI/includes.tmpl | 219 + StackExchange.Profiling35/UI/jquery.1.7.1.js | 4 + StackExchange.Profiling35/UI/jquery.tmpl.js | 486 + StackExchange.Profiling35/UI/list.css | 9 + StackExchange.Profiling35/UI/list.js | 38 + StackExchange.Profiling35/UI/list.tmpl | 34 + StackExchange.Profiling35/UI/share.html | 11 + .../WebRequestProfilerProvider.Settings.cs | 0 .../WebRequestProfilerProvider.cs | 161 + StackExchange.Profiling35/miniprofiler.snk | Bin 0 -> 596 bytes StackExchange.Profiling35/packages.config | 4 + .../TaskParallelLibrary.1.0.2856.0.nuspec | 22 + .../lib/Net35/System.Threading.chm | Bin 0 -> 1542346 bytes .../lib/Net35/System.Threading.dll | Bin 0 -> 387408 bytes .../lib/Net35/System.Threading.xml | 19811 ++++++++++++++++ .../lib/Net35/redist.txt | 11 + packages/repositories.config | 4 +- 93 files changed, 35807 insertions(+), 396 deletions(-) create mode 100644 Sample.WebForms-NET35/About.aspx create mode 100644 Sample.WebForms-NET35/About.aspx.cs create mode 100644 Sample.WebForms-NET35/About.aspx.designer.cs create mode 100644 Sample.WebForms-NET35/Account/ChangePassword.aspx create mode 100644 Sample.WebForms-NET35/Account/ChangePassword.aspx.cs create mode 100644 Sample.WebForms-NET35/Account/ChangePassword.aspx.designer.cs create mode 100644 Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx create mode 100644 Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.cs create mode 100644 Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.designer.cs create mode 100644 Sample.WebForms-NET35/Account/Login.aspx create mode 100644 Sample.WebForms-NET35/Account/Login.aspx.cs create mode 100644 Sample.WebForms-NET35/Account/Login.aspx.designer.cs create mode 100644 Sample.WebForms-NET35/Account/Register.aspx create mode 100644 Sample.WebForms-NET35/Account/Register.aspx.cs create mode 100644 Sample.WebForms-NET35/Account/Register.aspx.designer.cs create mode 100644 Sample.WebForms-NET35/Account/Web.config create mode 100644 Sample.WebForms-NET35/Default.aspx create mode 100644 Sample.WebForms-NET35/Default.aspx.cs create mode 100644 Sample.WebForms-NET35/Default.aspx.designer.cs create mode 100644 Sample.WebForms-NET35/Global.asax create mode 100644 Sample.WebForms-NET35/Global.asax.cs create mode 100644 Sample.WebForms-NET35/Properties/AssemblyInfo.cs create mode 100644 Sample.WebForms-NET35/Sample.WebForms-NET35.csproj create mode 100644 Sample.WebForms-NET35/Scripts/jquery-1.7.1.intellisense.js create mode 100644 Sample.WebForms-NET35/Scripts/jquery-1.7.1.js create mode 100644 Sample.WebForms-NET35/Scripts/jquery-1.7.1.min.js create mode 100644 Sample.WebForms-NET35/Site.Master create mode 100644 Sample.WebForms-NET35/Site.Master.cs create mode 100644 Sample.WebForms-NET35/Site.Master.designer.cs create mode 100644 Sample.WebForms-NET35/Styles/Site.css create mode 100644 Sample.WebForms-NET35/Web.Debug.config create mode 100644 Sample.WebForms-NET35/Web.Release.config create mode 100644 Sample.WebForms-NET35/Web.config delete mode 100644 StackExchange.Profiling/ClientTimingHelper.cs delete mode 100644 StackExchange.Profiling/Helpers/StackTraceSnippet.cs rename {StackExchange.Profiling => StackExchange.Profiling35}/BaseProfilerProvider.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/ClientTimings.cs (94%) create mode 100644 StackExchange.Profiling35/Helpers/ExtensionMethods.cs rename {StackExchange.Profiling => StackExchange.Profiling35}/Helpers/HaackFormatter.cs (100%) rename StackExchange.Profiling/Helpers/IStopwatch.cs => StackExchange.Profiling35/Helpers/IStopWatch.cs (99%) create mode 100644 StackExchange.Profiling35/Helpers/StackTraceSnippet.cs create mode 100644 StackExchange.Profiling35/Helpers/Tuples.cs rename {StackExchange.Profiling => StackExchange.Profiling35}/IProfilerProvider.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/IUserProvider.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/IpAddressProvider.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/MiniProfiler.IDbProfiler.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/MiniProfiler.Settings.cs (98%) rename {StackExchange.Profiling => StackExchange.Profiling35}/MiniProfiler.cs (92%) create mode 100644 StackExchange.Profiling35/Properties/AssemblyInfo.cs rename {StackExchange.Profiling => StackExchange.Profiling35}/SqlFormatters/ISqlFormatter.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/SqlFormatters/InlineFormatter.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/SqlFormatters/OracleFormatter.cs (94%) rename {StackExchange.Profiling => StackExchange.Profiling35}/SqlFormatters/SqlServerFormatter.cs (95%) rename {StackExchange.Profiling => StackExchange.Profiling35}/SqlProfiler.cs (99%) rename {StackExchange.Profiling => StackExchange.Profiling35}/SqlTiming.cs (98%) rename {StackExchange.Profiling => StackExchange.Profiling35}/SqlTimingParameter.cs (100%) create mode 100644 StackExchange.Profiling35/StackExchange.Profiling35.csproj rename {StackExchange.Profiling => StackExchange.Profiling35}/Storage/DatabaseStorageBase.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/Storage/HttpRuntimeCacheStorage.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/Storage/IStorage.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/Timing.cs (100%) rename {StackExchange.Profiling => StackExchange.Profiling35}/UI/MiniProfilerHandler.cs (89%) create mode 100644 StackExchange.Profiling35/UI/include.partial.html create mode 100644 StackExchange.Profiling35/UI/includes.css create mode 100644 StackExchange.Profiling35/UI/includes.js create mode 100644 StackExchange.Profiling35/UI/includes.less create mode 100644 StackExchange.Profiling35/UI/includes.tmpl create mode 100644 StackExchange.Profiling35/UI/jquery.1.7.1.js create mode 100644 StackExchange.Profiling35/UI/jquery.tmpl.js create mode 100644 StackExchange.Profiling35/UI/list.css create mode 100644 StackExchange.Profiling35/UI/list.js create mode 100644 StackExchange.Profiling35/UI/list.tmpl create mode 100644 StackExchange.Profiling35/UI/share.html rename {StackExchange.Profiling => StackExchange.Profiling35}/WebRequestProfilerProvider.Settings.cs (100%) create mode 100644 StackExchange.Profiling35/WebRequestProfilerProvider.cs create mode 100644 StackExchange.Profiling35/miniprofiler.snk create mode 100644 StackExchange.Profiling35/packages.config create mode 100644 packages/TaskParallelLibrary.1.0.2856.0/TaskParallelLibrary.1.0.2856.0.nuspec create mode 100644 packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/System.Threading.chm create mode 100644 packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/System.Threading.dll create mode 100644 packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/System.Threading.xml create mode 100644 packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/redist.txt diff --git a/MiniProfiler.sln b/MiniProfiler.sln index 6cc2db5..1354367 100644 --- a/MiniProfiler.sln +++ b/MiniProfiler.sln @@ -34,6 +34,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.Wcf", "Sample.Wcf\Sa EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StackExchange.Profiling.AdoNet", "StackExchange.Profiling.AdoNet\StackExchange.Profiling.AdoNet.csproj", "{44612123-B2E2-458A-859F-7077134D31C8}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample.WebForms-NET35", "Sample.WebForms-NET35\Sample.WebForms-NET35.csproj", "{976F2910-315D-41A1-9CBF-8BAD9F420E81}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StackExchange.Profiling35", "StackExchange.Profiling35\StackExchange.Profiling35.csproj", "{AB77F5B3-615E-446B-9905-833FDEF734A0}" +EndProject Global GlobalSection(TestCaseManagementSettings) = postSolution CategoryFile = StackExchange.Profiling.vsmdi @@ -75,6 +79,14 @@ Global {44612123-B2E2-458A-859F-7077134D31C8}.Debug|Any CPU.Build.0 = Debug|Any CPU {44612123-B2E2-458A-859F-7077134D31C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {44612123-B2E2-458A-859F-7077134D31C8}.Release|Any CPU.Build.0 = Release|Any CPU + {976F2910-315D-41A1-9CBF-8BAD9F420E81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {976F2910-315D-41A1-9CBF-8BAD9F420E81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {976F2910-315D-41A1-9CBF-8BAD9F420E81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {976F2910-315D-41A1-9CBF-8BAD9F420E81}.Release|Any CPU.Build.0 = Release|Any CPU + {AB77F5B3-615E-446B-9905-833FDEF734A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AB77F5B3-615E-446B-9905-833FDEF734A0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AB77F5B3-615E-446B-9905-833FDEF734A0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AB77F5B3-615E-446B-9905-833FDEF734A0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sample.Mvc/Sample.Mvc.csproj b/Sample.Mvc/Sample.Mvc.csproj index 583b040..b1cf964 100644 --- a/Sample.Mvc/Sample.Mvc.csproj +++ b/Sample.Mvc/Sample.Mvc.csproj @@ -202,6 +202,10 @@ {c471b0e5-0ae4-48e0-a938-02aeda030c5e} StackExchange.Profiling.Wcf + + {ab77f5b3-615e-446b-9905-833fdef734a0} + StackExchange.Profiling35 + {386222bd-6b6e-480f-a342-8de1ab516e2c} StackExchange.Profiling diff --git a/Sample.Wcf/Sample.Wcf.csproj b/Sample.Wcf/Sample.Wcf.csproj index 06b5b37..61e1771 100644 --- a/Sample.Wcf/Sample.Wcf.csproj +++ b/Sample.Wcf/Sample.Wcf.csproj @@ -104,6 +104,10 @@ {C471B0E5-0AE4-48E0-A938-02AEDA030C5E} StackExchange.Profiling.Wcf + + {ab77f5b3-615e-446b-9905-833fdef734a0} + StackExchange.Profiling35 + {386222BD-6B6E-480F-A342-8DE1AB516E2C} StackExchange.Profiling diff --git a/Sample.WebForms-NET35/About.aspx b/Sample.WebForms-NET35/About.aspx new file mode 100644 index 0000000..1d363dc --- /dev/null +++ b/Sample.WebForms-NET35/About.aspx @@ -0,0 +1,13 @@ +<%@ Page Title="About Us" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" + CodeBehind="About.aspx.cs" Inherits="Sample.WebForms_NET35.About" %> + + + + +

+ About +

+

+ Put content here. +

+
diff --git a/Sample.WebForms-NET35/About.aspx.cs b/Sample.WebForms-NET35/About.aspx.cs new file mode 100644 index 0000000..978b652 --- /dev/null +++ b/Sample.WebForms-NET35/About.aspx.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace Sample.WebForms_NET35 +{ + public partial class About : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/Sample.WebForms-NET35/About.aspx.designer.cs b/Sample.WebForms-NET35/About.aspx.designer.cs new file mode 100644 index 0000000..1e72198 --- /dev/null +++ b/Sample.WebForms-NET35/About.aspx.designer.cs @@ -0,0 +1,15 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Sample.WebForms_NET35 { + + + public partial class About { + } +} diff --git a/Sample.WebForms-NET35/Account/ChangePassword.aspx b/Sample.WebForms-NET35/Account/ChangePassword.aspx new file mode 100644 index 0000000..73cdfc3 --- /dev/null +++ b/Sample.WebForms-NET35/Account/ChangePassword.aspx @@ -0,0 +1,60 @@ +<%@ Page Title="Change Password" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" + CodeBehind="ChangePassword.aspx.cs" Inherits="Sample.WebForms_NET35.Account.ChangePassword" %> + + + + +

+ Change Password +

+

+ Use the form below to change your password. +

+

+ New passwords are required to be a minimum of <%= Membership.MinRequiredPasswordLength %> characters in length. +

+ + + + + + +
+
+ Account Information +

+ Old Password: + + * +

+

+ New Password: + + * +

+

+ Confirm New Password: + + * + * +

+
+

+ + +

+
+
+
+
diff --git a/Sample.WebForms-NET35/Account/ChangePassword.aspx.cs b/Sample.WebForms-NET35/Account/ChangePassword.aspx.cs new file mode 100644 index 0000000..089bcb6 --- /dev/null +++ b/Sample.WebForms-NET35/Account/ChangePassword.aspx.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace Sample.WebForms_NET35.Account +{ + public partial class ChangePassword : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/Sample.WebForms-NET35/Account/ChangePassword.aspx.designer.cs b/Sample.WebForms-NET35/Account/ChangePassword.aspx.designer.cs new file mode 100644 index 0000000..eb34f91 --- /dev/null +++ b/Sample.WebForms-NET35/Account/ChangePassword.aspx.designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Sample.WebForms.Account +{ + + + public partial class ChangePassword + { + + /// + /// ChangeUserPassword control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.ChangePassword ChangeUserPassword; + } +} diff --git a/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx b/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx new file mode 100644 index 0000000..5b17503 --- /dev/null +++ b/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx @@ -0,0 +1,13 @@ +<%@ Page Title="Change Password" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" + CodeBehind="ChangePasswordSuccess.aspx.cs" Inherits="Sample.WebForms_NET35.Account.ChangePasswordSuccess" %> + + + + +

+ Change Password +

+

+ Your password has been changed successfully. +

+
diff --git a/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.cs b/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.cs new file mode 100644 index 0000000..dc018b0 --- /dev/null +++ b/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace Sample.WebForms_NET35.Account +{ + public partial class ChangePasswordSuccess : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.designer.cs b/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.designer.cs new file mode 100644 index 0000000..40b4035 --- /dev/null +++ b/Sample.WebForms-NET35/Account/ChangePasswordSuccess.aspx.designer.cs @@ -0,0 +1,17 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Sample.WebForms.Account +{ + + + public partial class ChangePasswordSuccess + { + } +} diff --git a/Sample.WebForms-NET35/Account/Login.aspx b/Sample.WebForms-NET35/Account/Login.aspx new file mode 100644 index 0000000..cd5e6b0 --- /dev/null +++ b/Sample.WebForms-NET35/Account/Login.aspx @@ -0,0 +1,51 @@ +<%@ Page Title="Log In" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" + CodeBehind="lLogin.aspx.cs" Inherits="Sample.WebForms_NET35.Account.Login" %> + + + + +

+ Log In +

+

+ Please enter your username and password. + + Register if you don't have an account. + +

+ + + + + + +
+ +

+ +

+
+
+
+
diff --git a/Sample.WebForms-NET35/Account/Login.aspx.cs b/Sample.WebForms-NET35/Account/Login.aspx.cs new file mode 100644 index 0000000..31501cb --- /dev/null +++ b/Sample.WebForms-NET35/Account/Login.aspx.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace Sample.WebForms_NET35.Account +{ + public partial class Login : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + // RegisterHyperLink.NavigateUrl = "Register.aspx?ReturnUrl=" + HttpUtility.UrlEncode(Request.QueryString["ReturnUrl"]); + } + } +} diff --git a/Sample.WebForms-NET35/Account/Login.aspx.designer.cs b/Sample.WebForms-NET35/Account/Login.aspx.designer.cs new file mode 100644 index 0000000..add128b --- /dev/null +++ b/Sample.WebForms-NET35/Account/Login.aspx.designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Sample.WebForms_NET35.Account +{ + + + public partial class Login1 + { + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/Sample.WebForms-NET35/Account/Register.aspx b/Sample.WebForms-NET35/Account/Register.aspx new file mode 100644 index 0000000..734632d --- /dev/null +++ b/Sample.WebForms-NET35/Account/Register.aspx @@ -0,0 +1,75 @@ +<%@ Page Title="Register" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" + CodeBehind="Register.aspx.cs" Inherits="Sample.WebForms_NET35.Account.Register" %> + + + + + + + + + + + + +

+ Create a New Account +

+

+ Use the form below to create a new account. +

+

+ Passwords are required to be a minimum of <%= Membership.MinRequiredPasswordLength %> characters in length. +

+ + + + +
+
+ Account Information +

+ User Name: + + * +

+

+ E-mail: + + * +

+

+ Password: + + * +

+

+ Confirm Password: + + * + * +

+
+

+ +

+
+
+ + +
+
+
+
diff --git a/Sample.WebForms-NET35/Account/Register.aspx.cs b/Sample.WebForms-NET35/Account/Register.aspx.cs new file mode 100644 index 0000000..f024921 --- /dev/null +++ b/Sample.WebForms-NET35/Account/Register.aspx.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace Sample.WebForms_NET35.Account +{ + public partial class Register : System.Web.UI.Page + { + + protected void Page_Load(object sender, EventArgs e) + { + //RegisterUser.ContinueDestinationPageUrl = Request.QueryString["ReturnUrl"]; + } + + protected void RegisterUser_CreatedUser(object sender, EventArgs e) + { + //FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */); + /* + string continueUrl = RegisterUser.ContinueDestinationPageUrl; + if (String.IsNullOrEmpty(continueUrl)) + { + continueUrl = "~/"; + } + Response.Redirect(continueUrl);*/ + } + + } +} diff --git a/Sample.WebForms-NET35/Account/Register.aspx.designer.cs b/Sample.WebForms-NET35/Account/Register.aspx.designer.cs new file mode 100644 index 0000000..b72d4d0 --- /dev/null +++ b/Sample.WebForms-NET35/Account/Register.aspx.designer.cs @@ -0,0 +1,35 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Sample.WebForms.Account +{ + + + public partial class Register + { + + /// + /// RegisterUser control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CreateUserWizard RegisterUser; + + /// + /// RegisterUserWizardStep control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CreateUserWizardStep RegisterUserWizardStep; + } +} diff --git a/Sample.WebForms-NET35/Account/Web.config b/Sample.WebForms-NET35/Account/Web.config new file mode 100644 index 0000000..84a802a --- /dev/null +++ b/Sample.WebForms-NET35/Account/Web.config @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/Sample.WebForms-NET35/Default.aspx b/Sample.WebForms-NET35/Default.aspx new file mode 100644 index 0000000..c05baaa --- /dev/null +++ b/Sample.WebForms-NET35/Default.aspx @@ -0,0 +1,26 @@ +<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" + CodeBehind="Default.aspx.cs" Inherits="Sample.WebForms_NET35._Default" %> +<%@ Import Namespace="StackExchange.Profiling" %> + + +<% using (MiniProfiler.Current.Step("Default's ")) + { + System.Threading.Thread.Sleep(20); %> + + + +<% } %> + + + +

+ Welcome to ASP.NET! +

+

+ To learn more about ASP.NET visit www.asp.net. +

+

+ You can also find documentation on ASP.NET at MSDN. +

+
diff --git a/Sample.WebForms-NET35/Default.aspx.cs b/Sample.WebForms-NET35/Default.aspx.cs new file mode 100644 index 0000000..9ca4535 --- /dev/null +++ b/Sample.WebForms-NET35/Default.aspx.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using StackExchange.Profiling; + +namespace Sample.WebForms_NET35 +{ + public partial class _Default : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + /*var mp = MiniProfiler.Current; + + using (mp.Step("Page_Load")) + { + System.Threading.Thread.Sleep(40); + }*/ + } + } +} diff --git a/Sample.WebForms-NET35/Default.aspx.designer.cs b/Sample.WebForms-NET35/Default.aspx.designer.cs new file mode 100644 index 0000000..d8b7711 --- /dev/null +++ b/Sample.WebForms-NET35/Default.aspx.designer.cs @@ -0,0 +1,15 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Sample.WebForms_NET35 { + + + public partial class _Default { + } +} diff --git a/Sample.WebForms-NET35/Global.asax b/Sample.WebForms-NET35/Global.asax new file mode 100644 index 0000000..cdf133b --- /dev/null +++ b/Sample.WebForms-NET35/Global.asax @@ -0,0 +1 @@ +<%@ Application Codebehind="Global.asax.cs" Inherits="Sample.WebForms.Global" Language="C#" %> diff --git a/Sample.WebForms-NET35/Global.asax.cs b/Sample.WebForms-NET35/Global.asax.cs new file mode 100644 index 0000000..94c6523 --- /dev/null +++ b/Sample.WebForms-NET35/Global.asax.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Web; +using System.Web.Security; +using System.Web.SessionState; +using StackExchange.Profiling; + +namespace Sample.WebForms_NET35 +{ + public class Global : System.Web.HttpApplication + { + + void Application_Start(object sender, EventArgs e) + { + InitProfilerSettings(); + + // this is only done for testing purposes so we don't check in the db to source control + // ((SampleWeb.Helpers.SqliteMiniProfilerStorage)MiniProfiler.Settings.Storage).RecreateDatabase(); + } + + protected void Application_BeginRequest() + { + MiniProfiler profiler = null; + + // might want to decide here (or maybe inside the action) whether you want + // to profile this request - for example, using an "IsSystemAdmin" flag against + // the user, or similar; this could also all be done in action filters, but this + // is simple and practical; just return null for most users. For our test, we'll + // profile only for local requests (seems reasonable) + if (Request.IsLocal) + { + profiler = MiniProfiler.Start(); + } + + using (profiler.Step("Application_BeginRequest")) + { + // you can start profiling your code immediately + } + } + + protected void Application_EndRequest() + { + MiniProfiler.Stop(); + } + + /// + /// Customize aspects of the MiniProfiler. + /// + private void InitProfilerSettings() + { + // some things should never be seen + var ignored = MiniProfiler.Settings.IgnoredPaths.ToList(); + ignored.Add("WebResource.axd"); + ignored.Add("/Styles/"); + MiniProfiler.Settings.IgnoredPaths = ignored.ToArray(); + + // MiniProfiler.Settings.Storage = new SampleWeb.Helpers.SqliteMiniProfilerStorage(SampleWeb.MvcApplication.ConnectionString); + MiniProfiler.Settings.SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter(); + } + } +} diff --git a/Sample.WebForms-NET35/Properties/AssemblyInfo.cs b/Sample.WebForms-NET35/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..5b315e9 --- /dev/null +++ b/Sample.WebForms-NET35/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Sample.WebForms_NET35")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Sample.WebForms_NET35")] +[assembly: AssemblyCopyright("Copyright © 2012")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("763f7abf-1379-4a99-b0b7-869462632873")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Sample.WebForms-NET35/Sample.WebForms-NET35.csproj b/Sample.WebForms-NET35/Sample.WebForms-NET35.csproj new file mode 100644 index 0000000..31ad15d --- /dev/null +++ b/Sample.WebForms-NET35/Sample.WebForms-NET35.csproj @@ -0,0 +1,178 @@ + + + + + Debug + AnyCPU + + + 2.0 + {976F2910-315D-41A1-9CBF-8BAD9F420E81} + {349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc} + Library + Properties + Sample.WebForms_NET35 + Sample.WebForms-NET35 + v3.5 + true + + + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + About.aspx + ASPXCodeBehind + + + About.aspx + + + ChangePassword.aspx + ASPXCodeBehind + + + ChangePasswordSuccess.aspx + ASPXCodeBehind + + + Login.aspx + ASPXCodeBehind + + + Login.aspx + + + Register.aspx + ASPXCodeBehind + + + Default.aspx + ASPXCodeBehind + + + Default.aspx + + + Global.asax + + + + Site.Master + ASPXCodeBehind + + + Site.Master + + + + + + + + + + + + + + + + + Web.config + + + + + Web.config + + + + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + + + {ab77f5b3-615e-446b-9905-833fdef734a0} + StackExchange.Profiling35 + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + + + + + True + True + 0 + / + http://localhost:10324/ + False + False + + + False + + + + + + \ No newline at end of file diff --git a/Sample.WebForms-NET35/Scripts/jquery-1.7.1.intellisense.js b/Sample.WebForms-NET35/Scripts/jquery-1.7.1.intellisense.js new file mode 100644 index 0000000..35a9a25 --- /dev/null +++ b/Sample.WebForms-NET35/Scripts/jquery-1.7.1.intellisense.js @@ -0,0 +1,2521 @@ +/*! + * Documentation Content + * Copyright (c) 2009 Packt Publishing, http://packtpub.com/ + * Copyright (c) 2012 jQuery Foundation, http://jquery.org/ + * + * This software consists of voluntary contributions made by many + * individuals. For exact contribution history, see the revision history + * and logs, available at http://github.com/jquery/api.jquery.com + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +intellisense.annotate(jQuery, { + 'ajax': function() { + /// + /// Perform an asynchronous HTTP (Ajax) request. + /// A string containing the URL to which the request is sent. + /// A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). See jQuery.ajax( settings ) below for a complete list of all settings. + /// + /// + /// + /// Perform an asynchronous HTTP (Ajax) request. + /// A set of key/value pairs that configure the Ajax request. All settings are optional. A default can be set for any option with $.ajaxSetup(). + /// + /// + }, + 'ajaxPrefilter': function() { + /// + /// Handle custom Ajax options or modify existing options before each request is sent and before they are processed by $.ajax(). + /// An optional string containing one or more space-separated dataTypes + /// A handler to set default values for future Ajax requests. + /// + }, + 'ajaxSetup': function() { + /// + /// Set default values for future Ajax requests. + /// A set of key/value pairs that configure the default Ajax request. All options are optional. + /// + }, + 'boxModel': function() { + /// Deprecated in jQuery 1.3 (see jQuery.support). States if the current page, in the user's browser, is being rendered using the W3C CSS Box Model. + /// + }, + 'browser': function() { + /// Contains flags for the useragent, read from navigator.userAgent. We recommend against using this property; please try to use feature detection instead (see jQuery.support). jQuery.browser may be moved to a plugin in a future release of jQuery. + /// + }, + 'browser.version': function() { + /// The version number of the rendering engine for the user's browser. + /// + }, + 'Callbacks': function() { + /// + /// A multi-purpose callbacks list object that provides a powerful way to manage callback lists. + /// An optional list of space-separated flags that change how the callback list behaves. + /// + }, + 'contains': function() { + /// + /// Check to see if a DOM element is within another DOM element. + /// The DOM element that may contain the other element. + /// The DOM element that may be contained by the other element. + /// + /// + }, + 'cssHooks': function() { + /// Hook directly into jQuery to override how particular CSS properties are retrieved or set, normalize CSS property naming, or create custom properties. + /// + }, + 'data': function() { + /// + /// Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element. + /// The DOM element to query for the data. + /// Name of the data stored. + /// + /// + /// + /// Returns value at named data store for the element, as set by jQuery.data(element, name, value), or the full data store for the element. + /// The DOM element to query for the data. + /// + /// + }, + 'dequeue': function() { + /// + /// Execute the next function on the queue for the matched element. + /// A DOM element from which to remove and execute a queued function. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// + /// + }, + 'each': function() { + /// + /// A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties. + /// The object or array to iterate over. + /// The function that will be executed on every object. + /// + /// + }, + 'error': function() { + /// + /// Takes a string and throws an exception containing it. + /// The message to send out. + /// + }, + 'extend': function() { + /// + /// Merge the contents of two or more objects together into the first object. + /// An object that will receive the new properties if additional objects are passed in or that will extend the jQuery namespace if it is the sole argument. + /// An object containing additional properties to merge in. + /// Additional objects containing properties to merge in. + /// + /// + /// + /// Merge the contents of two or more objects together into the first object. + /// If true, the merge becomes recursive (aka. deep copy). + /// The object to extend. It will receive the new properties. + /// An object containing additional properties to merge in. + /// Additional objects containing properties to merge in. + /// + /// + }, + 'get': function() { + /// + /// Load data from the server using a HTTP GET request. + /// A string containing the URL to which the request is sent. + /// A map or string that is sent to the server with the request. + /// A callback function that is executed if the request succeeds. + /// The type of data expected from the server. Default: Intelligent Guess (xml, json, script, or html). + /// + /// + }, + 'getJSON': function() { + /// + /// Load JSON-encoded data from the server using a GET HTTP request. + /// A string containing the URL to which the request is sent. + /// A map or string that is sent to the server with the request. + /// A callback function that is executed if the request succeeds. + /// + /// + }, + 'getScript': function() { + /// + /// Load a JavaScript file from the server using a GET HTTP request, then execute it. + /// A string containing the URL to which the request is sent. + /// A callback function that is executed if the request succeeds. + /// + /// + }, + 'globalEval': function() { + /// + /// Execute some JavaScript code globally. + /// The JavaScript code to execute. + /// + }, + 'grep': function() { + /// + /// Finds the elements of an array which satisfy a filter function. The original array is not affected. + /// The array to search through. + /// The function to process each item against. The first argument to the function is the item, and the second argument is the index. The function should return a Boolean value. this will be the global window object. + /// If "invert" is false, or not provided, then the function returns an array consisting of all elements for which "callback" returns true. If "invert" is true, then the function returns an array consisting of all elements for which "callback" returns false. + /// + /// + }, + 'hasData': function() { + /// + /// Determine whether an element has any jQuery data associated with it. + /// A DOM element to be checked for data. + /// + /// + }, + 'holdReady': function() { + /// + /// Holds or releases the execution of jQuery's ready event. + /// Indicates whether the ready hold is being requested or released + /// + }, + 'inArray': function() { + /// + /// Search for a specified value within an array and return its index (or -1 if not found). + /// The value to search for. + /// An array through which to search. + /// The index of the array at which to begin the search. The default is 0, which will search the whole array. + /// + /// + }, + 'isArray': function() { + /// + /// Determine whether the argument is an array. + /// Object to test whether or not it is an array. + /// + /// + }, + 'isEmptyObject': function() { + /// + /// Check to see if an object is empty (contains no properties). + /// The object that will be checked to see if it's empty. + /// + /// + }, + 'isFunction': function() { + /// + /// Determine if the argument passed is a Javascript function object. + /// Object to test whether or not it is a function. + /// + /// + }, + 'isNumeric': function() { + /// + /// Determines whether its argument is a number. + /// The value to be tested. + /// + /// + }, + 'isPlainObject': function() { + /// + /// Check to see if an object is a plain object (created using "{}" or "new Object"). + /// The object that will be checked to see if it's a plain object. + /// + /// + }, + 'isWindow': function() { + /// + /// Determine whether the argument is a window. + /// Object to test whether or not it is a window. + /// + /// + }, + 'isXMLDoc': function() { + /// + /// Check to see if a DOM node is within an XML document (or is an XML document). + /// The DOM node that will be checked to see if it's in an XML document. + /// + /// + }, + 'makeArray': function() { + /// + /// Convert an array-like object into a true JavaScript array. + /// Any object to turn into a native Array. + /// + /// + }, + 'map': function() { + /// + /// Translate all items in an array or object to new array of items. + /// The Array to translate. + /// The function to process each item against. The first argument to the function is the array item, the second argument is the index in array The function can return any value. Within the function, this refers to the global (window) object. + /// + /// + /// + /// Translate all items in an array or object to new array of items. + /// The Array or Object to translate. + /// The function to process each item against. The first argument to the function is the value; the second argument is the index or key of the array or object property. The function can return any value to add to the array. A returned array will be flattened into the resulting array. Within the function, this refers to the global (window) object. + /// + /// + }, + 'merge': function() { + /// + /// Merge the contents of two arrays together into the first array. + /// The first array to merge, the elements of second added. + /// The second array to merge into the first, unaltered. + /// + /// + }, + 'noConflict': function() { + /// + /// Relinquish jQuery's control of the $ variable. + /// A Boolean indicating whether to remove all jQuery variables from the global scope (including jQuery itself). + /// + /// + }, + 'noop': function() { + /// An empty function. + /// + }, + 'now': function() { + /// Return a number representing the current time. + /// + }, + 'param': function() { + /// + /// Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request. + /// An array or object to serialize. + /// + /// + /// + /// Create a serialized representation of an array or object, suitable for use in a URL query string or Ajax request. + /// An array or object to serialize. + /// A Boolean indicating whether to perform a traditional "shallow" serialization. + /// + /// + }, + 'parseJSON': function() { + /// + /// Takes a well-formed JSON string and returns the resulting JavaScript object. + /// The JSON string to parse. + /// + /// + }, + 'parseXML': function() { + /// + /// Parses a string into an XML document. + /// a well-formed XML string to be parsed + /// + /// + }, + 'post': function() { + /// + /// Load data from the server using a HTTP POST request. + /// A string containing the URL to which the request is sent. + /// A map or string that is sent to the server with the request. + /// A callback function that is executed if the request succeeds. + /// The type of data expected from the server. Default: Intelligent Guess (xml, json, script, text, html). + /// + /// + }, + 'proxy': function() { + /// + /// Takes a function and returns a new one that will always have a particular context. + /// The function whose context will be changed. + /// The object to which the context (this) of the function should be set. + /// + /// + /// + /// Takes a function and returns a new one that will always have a particular context. + /// The object to which the context of the function should be set. + /// The name of the function whose context will be changed (should be a property of the context object). + /// + /// + }, + 'queue': function() { + /// + /// Manipulate the queue of functions to be executed on the matched element. + /// A DOM element where the array of queued functions is attached. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// An array of functions to replace the current queue contents. + /// + /// + /// + /// Manipulate the queue of functions to be executed on the matched element. + /// A DOM element on which to add a queued function. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// The new function to add to the queue. + /// + /// + }, + 'removeData': function() { + /// + /// Remove a previously-stored piece of data. + /// A DOM element from which to remove data. + /// A string naming the piece of data to remove. + /// + /// + }, + 'sub': function() { + /// Creates a new copy of jQuery whose properties and methods can be modified without affecting the original jQuery object. + /// + }, + 'support': function() { + /// A collection of properties that represent the presence of different browser features or bugs. Primarily intended for jQuery's internal use; specific properties may be removed when they are no longer needed internally to improve page startup performance. + /// + }, + 'trim': function() { + /// + /// Remove the whitespace from the beginning and end of a string. + /// The string to trim. + /// + /// + }, + 'type': function() { + /// + /// Determine the internal JavaScript [[Class]] of an object. + /// Object to get the internal JavaScript [[Class]] of. + /// + /// + }, + 'unique': function() { + /// + /// Sorts an array of DOM elements, in place, with the duplicates removed. Note that this only works on arrays of DOM elements, not strings or numbers. + /// The Array of DOM elements. + /// + /// + }, + 'when': function() { + /// + /// Provides a way to execute callback functions based on one or more objects, usually Deferred objects that represent asynchronous events. + /// One or more Deferred objects, or plain JavaScript objects. + /// + /// + }, +}); + +var _1228819969 = jQuery.Callbacks; +jQuery.Callbacks = function(flags) { +var _object = _1228819969(flags); +intellisense.annotate(_object, { + 'add': function() { + /// + /// Add a callback or a collection of callbacks to a callback list. + /// A function, or array of functions, that are to be added to the callback list. + /// + }, + 'disable': function() { + /// Disable a callback list from doing anything more. + }, + 'empty': function() { + /// Remove all of the callbacks from a list. + }, + 'fire': function() { + /// + /// Call all of the callbacks with the given arguments + /// The argument or list of arguments to pass back to the callback list. + /// + }, + 'fired': function() { + /// Determine if the callbacks have already been called at least once. + /// + }, + 'fireWith': function() { + /// + /// Call all callbacks in a list with the given context and arguments. + /// A reference to the context in which the callbacks in the list should be fired. + /// An argument, or array of arguments, to pass to the callbacks in the list. + /// + }, + 'has': function() { + /// + /// Determine whether a supplied callback is in a list + /// The callback to search for. + /// + /// + }, + 'lock': function() { + /// Lock a callback list in its current state. + }, + 'locked': function() { + /// Determine if the callbacks list has been locked. + /// + }, + 'remove': function() { + /// + /// Remove a callback or a collection of callbacks from a callback list. + /// A function, or array of functions, that are to be removed from the callback list. + /// + }, +}); + +return _object; +}; + +var _731531622 = jQuery.Deferred; +jQuery.Deferred = function(func) { +var _object = _731531622(func); +intellisense.annotate(_object, { + 'always': function() { + /// + /// Add handlers to be called when the Deferred object is either resolved or rejected. + /// A function, or array of functions, that is called when the Deferred is resolved or rejected. + /// Optional additional functions, or arrays of functions, that are called when the Deferred is resolved or rejected. + /// + /// + }, + 'done': function() { + /// + /// Add handlers to be called when the Deferred object is resolved. + /// A function, or array of functions, that are called when the Deferred is resolved. + /// Optional additional functions, or arrays of functions, that are called when the Deferred is resolved. + /// + /// + }, + 'fail': function() { + /// + /// Add handlers to be called when the Deferred object is rejected. + /// A function, or array of functions, that are called when the Deferred is rejected. + /// Optional additional functions, or arrays of functions, that are called when the Deferred is rejected. + /// + /// + }, + 'isRejected': function() { + /// Determine whether a Deferred object has been rejected. + /// + }, + 'isResolved': function() { + /// Determine whether a Deferred object has been resolved. + /// + }, + 'notify': function() { + /// + /// Call the progressCallbacks on a Deferred object with the given args. + /// Optional arguments that are passed to the progressCallbacks. + /// + /// + }, + 'notifyWith': function() { + /// + /// Call the progressCallbacks on a Deferred object with the given context and args. + /// Context passed to the progressCallbacks as the this object. + /// Optional arguments that are passed to the progressCallbacks. + /// + /// + }, + 'pipe': function() { + /// + /// Utility method to filter and/or chain Deferreds. + /// An optional function that is called when the Deferred is resolved. + /// An optional function that is called when the Deferred is rejected. + /// + /// + /// + /// Utility method to filter and/or chain Deferreds. + /// An optional function that is called when the Deferred is resolved. + /// An optional function that is called when the Deferred is rejected. + /// An optional function that is called when progress notifications are sent to the Deferred. + /// + /// + }, + 'progress': function() { + /// + /// Add handlers to be called when the Deferred object generates progress notifications. + /// A function, or array of functions, that is called when the Deferred generates progress notifications. + /// + /// + }, + 'promise': function() { + /// + /// Return a Deferred's Promise object. + /// Object onto which the promise methods have to be attached + /// + /// + }, + 'reject': function() { + /// + /// Reject a Deferred object and call any failCallbacks with the given args. + /// Optional arguments that are passed to the failCallbacks. + /// + /// + }, + 'rejectWith': function() { + /// + /// Reject a Deferred object and call any failCallbacks with the given context and args. + /// Context passed to the failCallbacks as the this object. + /// An optional array of arguments that are passed to the failCallbacks. + /// + /// + }, + 'resolve': function() { + /// + /// Resolve a Deferred object and call any doneCallbacks with the given args. + /// Optional arguments that are passed to the doneCallbacks. + /// + /// + }, + 'resolveWith': function() { + /// + /// Resolve a Deferred object and call any doneCallbacks with the given context and args. + /// Context passed to the doneCallbacks as the this object. + /// An optional array of arguments that are passed to the doneCallbacks. + /// + /// + }, + 'state': function() { + /// Determine the current state of a Deferred object. + /// + }, + 'then': function() { + /// + /// Add handlers to be called when the Deferred object is resolved or rejected. + /// A function, or array of functions, called when the Deferred is resolved. + /// A function, or array of functions, called when the Deferred is rejected. + /// + /// + /// + /// Add handlers to be called when the Deferred object is resolved or rejected. + /// A function, or array of functions, called when the Deferred is resolved. + /// A function, or array of functions, called when the Deferred is rejected. + /// A function, or array of functions, called when the Deferred notifies progress. + /// + /// + }, +}); + +return _object; +}; + +intellisense.annotate(jQuery.Event.prototype, { + 'currentTarget': function() { + /// The current DOM element within the event bubbling phase. + /// + }, + 'data': function() { + /// An optional data map passed to an event method when the current executing handler is bound. + }, + 'delegateTarget': function() { + /// The element where the currently-called jQuery event handler was attached. + /// + }, + 'isDefaultPrevented': function() { + /// Returns whether event.preventDefault() was ever called on this event object. + /// + }, + 'isImmediatePropagationStopped': function() { + /// Returns whether event.stopImmediatePropagation() was ever called on this event object. + /// + }, + 'isPropagationStopped': function() { + /// Returns whether event.stopPropagation() was ever called on this event object. + /// + }, + 'namespace': function() { + /// The namespace specified when the event was triggered. + /// + }, + 'pageX': function() { + /// The mouse position relative to the left edge of the document. + /// + }, + 'pageY': function() { + /// The mouse position relative to the top edge of the document. + /// + }, + 'preventDefault': function() { + /// If this method is called, the default action of the event will not be triggered. + }, + 'relatedTarget': function() { + /// The other DOM element involved in the event, if any. + /// + }, + 'result': function() { + /// The last value returned by an event handler that was triggered by this event, unless the value was undefined. + /// + }, + 'stopImmediatePropagation': function() { + /// Keeps the rest of the handlers from being executed and prevents the event from bubbling up the DOM tree. + }, + 'stopPropagation': function() { + /// Prevents the event from bubbling up the DOM tree, preventing any parent handlers from being notified of the event. + }, + 'target': function() { + /// The DOM element that initiated the event. + /// + }, + 'timeStamp': function() { + /// The difference in milliseconds between the time the browser created the event and January 1, 1970. + /// + }, + 'type': function() { + /// Describes the nature of the event. + /// + }, + 'which': function() { + /// For key or mouse events, this property indicates the specific key or button that was pressed. + /// + }, +}); + +intellisense.annotate(jQuery.fn, { + 'add': function() { + /// + /// Add elements to the set of matched elements. + /// A string representing a selector expression to find additional elements to add to the set of matched elements. + /// + /// + /// + /// Add elements to the set of matched elements. + /// One or more elements to add to the set of matched elements. + /// + /// + /// + /// Add elements to the set of matched elements. + /// An HTML fragment to add to the set of matched elements. + /// + /// + /// + /// Add elements to the set of matched elements. + /// An existing jQuery object to add to the set of matched elements. + /// + /// + /// + /// Add elements to the set of matched elements. + /// A string representing a selector expression to find additional elements to add to the set of matched elements. + /// The point in the document at which the selector should begin matching; similar to the context argument of the $(selector, context) method. + /// + /// + }, + 'addClass': function() { + /// + /// Adds the specified class(es) to each of the set of matched elements. + /// One or more class names to be added to the class attribute of each matched element. + /// + /// + /// + /// Adds the specified class(es) to each of the set of matched elements. + /// A function returning one or more space-separated class names to be added to the existing class name(s). Receives the index position of the element in the set and the existing class name(s) as arguments. Within the function, this refers to the current element in the set. + /// + /// + }, + 'after': function() { + /// + /// Insert content, specified by the parameter, after each element in the set of matched elements. + /// HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements. + /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements. + /// + /// + /// + /// Insert content, specified by the parameter, after each element in the set of matched elements. + /// A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. + /// + /// + }, + 'ajaxComplete': function() { + /// + /// Register a handler to be called when Ajax requests complete. This is an Ajax Event. + /// The function to be invoked. + /// + /// + }, + 'ajaxError': function() { + /// + /// Register a handler to be called when Ajax requests complete with an error. This is an Ajax Event. + /// The function to be invoked. + /// + /// + }, + 'ajaxSend': function() { + /// + /// Attach a function to be executed before an Ajax request is sent. This is an Ajax Event. + /// The function to be invoked. + /// + /// + }, + 'ajaxStart': function() { + /// + /// Register a handler to be called when the first Ajax request begins. This is an Ajax Event. + /// The function to be invoked. + /// + /// + }, + 'ajaxStop': function() { + /// + /// Register a handler to be called when all Ajax requests have completed. This is an Ajax Event. + /// The function to be invoked. + /// + /// + }, + 'ajaxSuccess': function() { + /// + /// Attach a function to be executed whenever an Ajax request completes successfully. This is an Ajax Event. + /// The function to be invoked. + /// + /// + }, + 'all': function() { + /// Selects all elements. + }, + 'andSelf': function() { + /// Add the previous set of elements on the stack to the current set. + /// + }, + 'animate': function() { + /// + /// Perform a custom animation of a set of CSS properties. + /// A map of CSS properties that the animation will move toward. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + /// + /// Perform a custom animation of a set of CSS properties. + /// A map of CSS properties that the animation will move toward. + /// A map of additional options to pass to the method. Supported keys: duration: A string or number determining how long the animation will run.easing: A string indicating which easing function to use for the transition.complete: A function to call once the animation is complete.step: A function to be called after each step of the animation.queue: A Boolean indicating whether to place the animation in the effects queue. If false, the animation will begin immediately. As of jQuery 1.7, the queue option can also accept a string, in which case the animation is added to the queue represented by that string.specialEasing: A map of one or more of the CSS properties defined by the properties argument and their corresponding easing functions (added 1.4). + /// + /// + }, + 'animated': function() { + /// Select all elements that are in the progress of an animation at the time the selector is run. + }, + 'append': function() { + /// + /// Insert content, specified by the parameter, to the end of each element in the set of matched elements. + /// DOM element, HTML string, or jQuery object to insert at the end of each element in the set of matched elements. + /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the end of each element in the set of matched elements. + /// + /// + /// + /// Insert content, specified by the parameter, to the end of each element in the set of matched elements. + /// A function that returns an HTML string, DOM element(s), or jQuery object to insert at the end of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set. + /// + /// + }, + 'appendTo': function() { + /// + /// Insert every element in the set of matched elements to the end of the target. + /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the end of the element(s) specified by this parameter. + /// + /// + }, + 'attr': function() { + /// + /// Set one or more attributes for the set of matched elements. + /// The name of the attribute to set. + /// A value to set for the attribute. + /// + /// + /// + /// Set one or more attributes for the set of matched elements. + /// A map of attribute-value pairs to set. + /// + /// + /// + /// Set one or more attributes for the set of matched elements. + /// The name of the attribute to set. + /// A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old attribute value as arguments. + /// + /// + }, + 'attributeContains': function() { + /// + /// Selects elements that have the specified attribute with a value containing the a given substring. + /// An attribute name. + /// An attribute value. Can be either an unquoted single word or a quoted string. + /// + }, + 'attributeContainsPrefix': function() { + /// + /// Selects elements that have the specified attribute with a value either equal to a given string or starting with that string followed by a hyphen (-). + /// An attribute name. + /// An attribute value. Can be either an unquoted single word or a quoted string. + /// + }, + 'attributeContainsWord': function() { + /// + /// Selects elements that have the specified attribute with a value containing a given word, delimited by spaces. + /// An attribute name. + /// An attribute value. Can be either an unquoted single word or a quoted string. + /// + }, + 'attributeEndsWith': function() { + /// + /// Selects elements that have the specified attribute with a value ending exactly with a given string. The comparison is case sensitive. + /// An attribute name. + /// An attribute value. Can be either an unquoted single word or a quoted string. + /// + }, + 'attributeEquals': function() { + /// + /// Selects elements that have the specified attribute with a value exactly equal to a certain value. + /// An attribute name. + /// An attribute value. Can be either an unquoted single word or a quoted string. + /// + }, + 'attributeHas': function() { + /// + /// Selects elements that have the specified attribute, with any value. + /// An attribute name. + /// + }, + 'attributeMultiple': function() { + /// + /// Matches elements that match all of the specified attribute filters. + /// An attribute filter. + /// Another attribute filter, reducing the selection even more + /// As many more attribute filters as necessary + /// + }, + 'attributeNotEqual': function() { + /// + /// Select elements that either don't have the specified attribute, or do have the specified attribute but not with a certain value. + /// An attribute name. + /// An attribute value. Can be either an unquoted single word or a quoted string. + /// + }, + 'attributeStartsWith': function() { + /// + /// Selects elements that have the specified attribute with a value beginning exactly with a given string. + /// An attribute name. + /// An attribute value. Can be either an unquoted single word or a quoted string. + /// + }, + 'before': function() { + /// + /// Insert content, specified by the parameter, before each element in the set of matched elements. + /// HTML string, DOM element, or jQuery object to insert before each element in the set of matched elements. + /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert before each element in the set of matched elements. + /// + /// + /// + /// Insert content, specified by the parameter, before each element in the set of matched elements. + /// A function that returns an HTML string, DOM element(s), or jQuery object to insert before each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. + /// + /// + }, + 'bind': function() { + /// + /// Attach a handler to an event for the elements. + /// A string containing one or more DOM event types, such as "click" or "submit," or custom event names. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Attach a handler to an event for the elements. + /// A string containing one or more DOM event types, such as "click" or "submit," or custom event names. + /// A map of data that will be passed to the event handler. + /// Setting the third argument to false will attach a function that prevents the default action from occurring and stops the event from bubbling. The default is true. + /// + /// + /// + /// Attach a handler to an event for the elements. + /// A map of one or more DOM event types and functions to execute for them. + /// + /// + }, + 'blur': function() { + /// + /// Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "blur" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'button': function() { + /// Selects all button elements and elements of type button. + }, + 'change': function() { + /// + /// Bind an event handler to the "change" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "change" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'checkbox': function() { + /// Selects all elements of type checkbox. + }, + 'checked': function() { + /// Matches all elements that are checked. + }, + 'child': function() { + /// + /// Selects all direct child elements specified by "child" of elements specified by "parent". + /// Any valid selector. + /// A selector to filter the child elements. + /// + }, + 'children': function() { + /// + /// Get the children of each element in the set of matched elements, optionally filtered by a selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'class': function() { + /// + /// Selects all elements with the given class. + /// A class to search for. An element can have multiple classes; only one of them must match. + /// + }, + 'clearQueue': function() { + /// + /// Remove from the queue all items that have not yet been run. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// + /// + }, + 'click': function() { + /// + /// Bind an event handler to the "click" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "click" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'clone': function() { + /// + /// Create a deep copy of the set of matched elements. + /// A Boolean indicating whether event handlers should be copied along with the elements. As of jQuery 1.4, element data will be copied as well. + /// + /// + /// + /// Create a deep copy of the set of matched elements. + /// A Boolean indicating whether event handlers and data should be copied along with the elements. The default value is false. *In jQuery 1.5.0 the default value was incorrectly true; it was changed back to false in 1.5.1 and up. + /// A Boolean indicating whether event handlers and data for all children of the cloned element should be copied. By default its value matches the first argument's value (which defaults to false). + /// + /// + }, + 'closest': function() { + /// + /// Get the first element that matches the selector, beginning at the current element and progressing up through the DOM tree. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Get the first element that matches the selector, beginning at the current element and progressing up through the DOM tree. + /// A string containing a selector expression to match elements against. + /// A DOM element within which a matching element may be found. If no context is passed in then the context of the jQuery set will be used instead. + /// + /// + /// + /// Get the first element that matches the selector, beginning at the current element and progressing up through the DOM tree. + /// A jQuery object to match elements against. + /// + /// + /// + /// Get the first element that matches the selector, beginning at the current element and progressing up through the DOM tree. + /// An element to match elements against. + /// + /// + }, + 'contains': function() { + /// + /// Select all elements that contain the specified text. + /// A string of text to look for. It's case sensitive. + /// + }, + 'contents': function() { + /// Get the children of each element in the set of matched elements, including text and comment nodes. + /// + }, + 'context': function() { + /// The DOM node context originally passed to jQuery(); if none was passed then context will likely be the document. + /// + }, + 'css': function() { + /// + /// Set one or more CSS properties for the set of matched elements. + /// A CSS property name. + /// A value to set for the property. + /// + /// + /// + /// Set one or more CSS properties for the set of matched elements. + /// A CSS property name. + /// A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments. + /// + /// + /// + /// Set one or more CSS properties for the set of matched elements. + /// A map of property-value pairs to set. + /// + /// + }, + 'data': function() { + /// + /// Store arbitrary data associated with the matched elements. + /// A string naming the piece of data to set. + /// The new data value; it can be any Javascript type including Array or Object. + /// + /// + /// + /// Store arbitrary data associated with the matched elements. + /// An object of key-value pairs of data to update. + /// + /// + }, + 'dblclick': function() { + /// + /// Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "dblclick" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'delay': function() { + /// + /// Set a timer to delay execution of subsequent items in the queue. + /// An integer indicating the number of milliseconds to delay execution of the next item in the queue. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// + /// + }, + 'delegate': function() { + /// + /// Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. + /// A selector to filter the elements that trigger the event. + /// A string containing one or more space-separated JavaScript event types, such as "click" or "keydown," or custom event names. + /// A function to execute at the time the event is triggered. + /// + /// + /// + /// Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. + /// A selector to filter the elements that trigger the event. + /// A string containing one or more space-separated JavaScript event types, such as "click" or "keydown," or custom event names. + /// A map of data that will be passed to the event handler. + /// A function to execute at the time the event is triggered. + /// + /// + /// + /// Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements. + /// A selector to filter the elements that trigger the event. + /// A map of one or more event types and functions to execute for them. + /// + /// + }, + 'dequeue': function() { + /// + /// Execute the next function on the queue for the matched elements. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// + /// + }, + 'descendant': function() { + /// + /// Selects all elements that are descendants of a given ancestor. + /// Any valid selector. + /// A selector to filter the descendant elements. + /// + }, + 'detach': function() { + /// + /// Remove the set of matched elements from the DOM. + /// A selector expression that filters the set of matched elements to be removed. + /// + /// + }, + 'die': function() { + /// + /// Remove an event handler previously attached using .live() from the elements. + /// A string containing a JavaScript event type, such as click or keydown. + /// The function that is no longer to be executed. + /// + /// + /// + /// Remove an event handler previously attached using .live() from the elements. + /// A map of one or more event types, such as click or keydown and their corresponding functions that are no longer to be executed. + /// + /// + }, + 'disabled': function() { + /// Selects all elements that are disabled. + }, + 'each': function() { + /// + /// Iterate over a jQuery object, executing a function for each matched element. + /// A function to execute for each matched element. + /// + /// + }, + 'element': function() { + /// + /// Selects all elements with the given tag name. + /// An element to search for. Refers to the tagName of DOM nodes. + /// + }, + 'empty': function() { + /// Select all elements that have no children (including text nodes). + }, + 'enabled': function() { + /// Selects all elements that are enabled. + }, + 'end': function() { + /// End the most recent filtering operation in the current chain and return the set of matched elements to its previous state. + /// + }, + 'eq': function() { + /// + /// Reduce the set of matched elements to the one at the specified index. + /// An integer indicating the 0-based position of the element. + /// + /// + /// + /// Reduce the set of matched elements to the one at the specified index. + /// An integer indicating the position of the element, counting backwards from the last element in the set. + /// + /// + }, + 'error': function() { + /// + /// Bind an event handler to the "error" JavaScript event. + /// A function to execute when the event is triggered. + /// + /// + /// + /// Bind an event handler to the "error" JavaScript event. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'even': function() { + /// Selects even elements, zero-indexed. See also odd. + }, + 'fadeIn': function() { + /// + /// Display the matched elements by fading them to opaque. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Display the matched elements by fading them to opaque. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'fadeOut': function() { + /// + /// Hide the matched elements by fading them to transparent. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Hide the matched elements by fading them to transparent. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'fadeTo': function() { + /// + /// Adjust the opacity of the matched elements. + /// A string or number determining how long the animation will run. + /// A number between 0 and 1 denoting the target opacity. + /// A function to call once the animation is complete. + /// + /// + /// + /// Adjust the opacity of the matched elements. + /// A string or number determining how long the animation will run. + /// A number between 0 and 1 denoting the target opacity. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'fadeToggle': function() { + /// + /// Display or hide the matched elements by animating their opacity. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'file': function() { + /// Selects all elements of type file. + }, + 'filter': function() { + /// + /// Reduce the set of matched elements to those that match the selector or pass the function's test. + /// A string containing a selector expression to match the current set of elements against. + /// + /// + /// + /// Reduce the set of matched elements to those that match the selector or pass the function's test. + /// A function used as a test for each element in the set. this is the current DOM element. + /// + /// + /// + /// Reduce the set of matched elements to those that match the selector or pass the function's test. + /// An element to match the current set of elements against. + /// + /// + /// + /// Reduce the set of matched elements to those that match the selector or pass the function's test. + /// An existing jQuery object to match the current set of elements against. + /// + /// + }, + 'find': function() { + /// + /// Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. + /// A jQuery object to match elements against. + /// + /// + /// + /// Get the descendants of each element in the current set of matched elements, filtered by a selector, jQuery object, or element. + /// An element to match elements against. + /// + /// + }, + 'first': function() { + /// Selects the first matched element. + }, + 'first-child': function() { + /// Selects all elements that are the first child of their parent. + }, + 'focus': function() { + /// + /// Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "focus" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'focusin': function() { + /// + /// Bind an event handler to the "focusin" event. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "focusin" event. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'focusout': function() { + /// + /// Bind an event handler to the "focusout" JavaScript event. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "focusout" JavaScript event. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'get': function() { + /// + /// Retrieve the DOM elements matched by the jQuery object. + /// A zero-based integer indicating which element to retrieve. + /// + /// + }, + 'gt': function() { + /// + /// Select all elements at an index greater than index within the matched set. + /// Zero-based index. + /// + }, + 'has': function() { + /// + /// Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Reduce the set of matched elements to those that have a descendant that matches the selector or DOM element. + /// A DOM element to match elements against. + /// + /// + }, + 'hasClass': function() { + /// + /// Determine whether any of the matched elements are assigned the given class. + /// The class name to search for. + /// + /// + }, + 'header': function() { + /// Selects all elements that are headers, like h1, h2, h3 and so on. + }, + 'height': function() { + /// + /// Set the CSS height of every matched element. + /// An integer representing the number of pixels, or an integer with an optional unit of measure appended (as a string). + /// + /// + /// + /// Set the CSS height of every matched element. + /// A function returning the height to set. Receives the index position of the element in the set and the old height as arguments. Within the function, this refers to the current element in the set. + /// + /// + }, + 'hidden': function() { + /// Selects all elements that are hidden. + }, + 'hide': function() { + /// + /// Hide the matched elements. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Hide the matched elements. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'hover': function() { + /// + /// Bind two handlers to the matched elements, to be executed when the mouse pointer enters and leaves the elements. + /// A function to execute when the mouse pointer enters the element. + /// A function to execute when the mouse pointer leaves the element. + /// + /// + }, + 'html': function() { + /// + /// Set the HTML contents of each element in the set of matched elements. + /// A string of HTML to set as the content of each matched element. + /// + /// + /// + /// Set the HTML contents of each element in the set of matched elements. + /// A function returning the HTML content to set. Receives the index position of the element in the set and the old HTML value as arguments. jQuery empties the element before calling the function; use the oldhtml argument to reference the previous content. Within the function, this refers to the current element in the set. + /// + /// + }, + 'id': function() { + /// + /// Selects a single element with the given id attribute. + /// An ID to search for, specified via the id attribute of an element. + /// + }, + 'image': function() { + /// Selects all elements of type image. + }, + 'index': function() { + /// + /// Search for a given element from among the matched elements. + /// A selector representing a jQuery collection in which to look for an element. + /// + /// + /// + /// Search for a given element from among the matched elements. + /// The DOM element or first element within the jQuery object to look for. + /// + /// + }, + 'init': function() { + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// A string containing a selector expression + /// A DOM Element, Document, or jQuery to use as context + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// A DOM element to wrap in a jQuery object. + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// A plain object to wrap in a jQuery object. + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// An array containing a set of DOM elements to wrap in a jQuery object. + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// An existing jQuery object to clone. + /// + /// + }, + 'innerHeight': function() { + /// Get the current computed height for the first element in the set of matched elements, including padding but not border. + /// + }, + 'innerWidth': function() { + /// Get the current computed width for the first element in the set of matched elements, including padding but not border. + /// + }, + 'input': function() { + /// Selects all input, textarea, select and button elements. + }, + 'insertAfter': function() { + /// + /// Insert every element in the set of matched elements after the target. + /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted after the element(s) specified by this parameter. + /// + /// + }, + 'insertBefore': function() { + /// + /// Insert every element in the set of matched elements before the target. + /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted before the element(s) specified by this parameter. + /// + /// + }, + 'is': function() { + /// + /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. + /// A function used as a test for the set of elements. It accepts one argument, index, which is the element's index in the jQuery collection.Within the function, this refers to the current DOM element. + /// + /// + /// + /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. + /// An existing jQuery object to match the current set of elements against. + /// + /// + /// + /// Check the current matched set of elements against a selector, element, or jQuery object and return true if at least one of these elements matches the given arguments. + /// An element to match the current set of elements against. + /// + /// + }, + 'jquery': function() { + /// A string containing the jQuery version number. + /// + }, + 'keydown': function() { + /// + /// Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "keydown" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'keypress': function() { + /// + /// Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "keypress" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'keyup': function() { + /// + /// Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "keyup" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'last': function() { + /// Selects the last matched element. + }, + 'last-child': function() { + /// Selects all elements that are the last child of their parent. + }, + 'length': function() { + /// The number of elements in the jQuery object. + /// + }, + 'live': function() { + /// + /// Attach an event handler for all elements which match the current selector, now and in the future. + /// A string containing a JavaScript event type, such as "click" or "keydown." As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names. + /// A function to execute at the time the event is triggered. + /// + /// + /// + /// Attach an event handler for all elements which match the current selector, now and in the future. + /// A string containing a JavaScript event type, such as "click" or "keydown." As of jQuery 1.4 the string can contain multiple, space-separated event types or custom event names. + /// A map of data that will be passed to the event handler. + /// A function to execute at the time the event is triggered. + /// + /// + /// + /// Attach an event handler for all elements which match the current selector, now and in the future. + /// A map of one or more JavaScript event types and functions to execute for them. + /// + /// + }, + 'load': function() { + /// + /// Bind an event handler to the "load" JavaScript event. + /// A function to execute when the event is triggered. + /// + /// + /// + /// Bind an event handler to the "load" JavaScript event. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'lt': function() { + /// + /// Select all elements at an index less than index within the matched set. + /// Zero-based index. + /// + }, + 'map': function() { + /// + /// Pass each element in the current matched set through a function, producing a new jQuery object containing the return values. + /// A function object that will be invoked for each element in the current set. + /// + /// + }, + 'mousedown': function() { + /// + /// Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "mousedown" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'mouseenter': function() { + /// + /// Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to be fired when the mouse enters an element, or trigger that handler on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'mouseleave': function() { + /// + /// Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to be fired when the mouse leaves an element, or trigger that handler on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'mousemove': function() { + /// + /// Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "mousemove" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'mouseout': function() { + /// + /// Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "mouseout" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'mouseover': function() { + /// + /// Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "mouseover" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'mouseup': function() { + /// + /// Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "mouseup" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'multiple': function() { + /// + /// Selects the combined results of all the specified selectors. + /// Any valid selector. + /// Another valid selector. + /// As many more valid selectors as you like. + /// + }, + 'next': function() { + /// + /// Get the immediately following sibling of each element in the set of matched elements. If a selector is provided, it retrieves the next sibling only if it matches that selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'next adjacent': function() { + /// + /// Selects all next elements matching "next" that are immediately preceded by a sibling "prev". + /// Any valid selector. + /// A selector to match the element that is next to the first selector. + /// + }, + 'next siblings': function() { + /// + /// Selects all sibling elements that follow after the "prev" element, have the same parent, and match the filtering "siblings" selector. + /// Any valid selector. + /// A selector to filter elements that are the following siblings of the first selector. + /// + }, + 'nextAll': function() { + /// + /// Get all following siblings of each element in the set of matched elements, optionally filtered by a selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'nextUntil': function() { + /// + /// Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed. + /// A string containing a selector expression to indicate where to stop matching following sibling elements. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Get all following siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object passed. + /// A DOM node or jQuery object indicating where to stop matching following sibling elements. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'not': function() { + /// + /// Remove elements from the set of matched elements. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Remove elements from the set of matched elements. + /// One or more DOM elements to remove from the matched set. + /// + /// + /// + /// Remove elements from the set of matched elements. + /// A function used as a test for each element in the set. this is the current DOM element. + /// + /// + /// + /// Remove elements from the set of matched elements. + /// An existing jQuery object to match the current set of elements against. + /// + /// + }, + 'nth-child': function() { + /// + /// Selects all elements that are the nth-child of their parent. + /// The index of each child to match, starting with 1, the string even or odd, or an equation ( eg. :nth-child(even), :nth-child(4n) ) + /// + }, + 'odd': function() { + /// Selects odd elements, zero-indexed. See also even. + }, + 'off': function() { + /// + /// Remove an event handler. + /// One or more space-separated event types and optional namespaces, or just namespaces, such as "click", "keydown.myPlugin", or ".myPlugin". + /// A selector which should match the one originally passed to .on() when attaching event handlers. + /// A handler function previously attached for the event(s), or the special value false. + /// + /// + /// + /// Remove an event handler. + /// A map where the string keys represent one or more space-separated event types and optional namespaces, and the values represent handler functions previously attached for the event(s). + /// A selector which should match the one originally passed to .on() when attaching event handlers. + /// + /// + }, + 'offset': function() { + /// + /// Set the current coordinates of every element in the set of matched elements, relative to the document. + /// An object containing the properties top and left, which are integers indicating the new top and left coordinates for the elements. + /// + /// + /// + /// Set the current coordinates of every element in the set of matched elements, relative to the document. + /// A function to return the coordinates to set. Receives the index of the element in the collection as the first argument and the current coordinates as the second argument. The function should return an object with the new top and left properties. + /// + /// + }, + 'offsetParent': function() { + /// Get the closest ancestor element that is positioned. + /// + }, + 'on': function() { + /// + /// Attach an event handler function for one or more events to the selected elements. + /// One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + /// A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element. + /// Data to be passed to the handler in event.data when an event is triggered. + /// A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false. + /// + /// + /// + /// Attach an event handler function for one or more events to the selected elements. + /// A map in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s). + /// A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element. + /// Data to be passed to the handler in event.data when an event occurs. + /// + /// + }, + 'one': function() { + /// + /// Attach a handler to an event for the elements. The handler is executed at most once per element. + /// A string containing one or more JavaScript event types, such as "click" or "submit," or custom event names. + /// A map of data that will be passed to the event handler. + /// A function to execute at the time the event is triggered. + /// + /// + /// + /// Attach a handler to an event for the elements. The handler is executed at most once per element. + /// One or more space-separated event types and optional namespaces, such as "click" or "keydown.myPlugin". + /// A selector string to filter the descendants of the selected elements that trigger the event. If the selector is null or omitted, the event is always triggered when it reaches the selected element. + /// Data to be passed to the handler in event.data when an event is triggered. + /// A function to execute when the event is triggered. The value false is also allowed as a shorthand for a function that simply does return false. + /// + /// + /// + /// Attach a handler to an event for the elements. The handler is executed at most once per element. + /// A map in which the string keys represent one or more space-separated event types and optional namespaces, and the values represent a handler function to be called for the event(s). + /// A selector string to filter the descendants of the selected elements that will call the handler. If the selector is null or omitted, the handler is always called when it reaches the selected element. + /// Data to be passed to the handler in event.data when an event occurs. + /// + /// + }, + 'only-child': function() { + /// Selects all elements that are the only child of their parent. + }, + 'outerHeight': function() { + /// + /// Get the current computed height for the first element in the set of matched elements, including padding, border, and optionally margin. Returns an integer (without "px") representation of the value or null if called on an empty set of elements. + /// A Boolean indicating whether to include the element's margin in the calculation. + /// + /// + }, + 'outerWidth': function() { + /// + /// Get the current computed width for the first element in the set of matched elements, including padding and border. + /// A Boolean indicating whether to include the element's margin in the calculation. + /// + /// + }, + 'parent': function() { + /// + /// Get the parent of each element in the current set of matched elements, optionally filtered by a selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'parents': function() { + /// + /// Get the ancestors of each element in the current set of matched elements, optionally filtered by a selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'parentsUntil': function() { + /// + /// Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object. + /// A string containing a selector expression to indicate where to stop matching ancestor elements. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Get the ancestors of each element in the current set of matched elements, up to but not including the element matched by the selector, DOM node, or jQuery object. + /// A DOM node or jQuery object indicating where to stop matching ancestor elements. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'password': function() { + /// Selects all elements of type password. + }, + 'position': function() { + /// Get the current coordinates of the first element in the set of matched elements, relative to the offset parent. + /// + }, + 'prepend': function() { + /// + /// Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. + /// DOM element, array of elements, HTML string, or jQuery object to insert at the beginning of each element in the set of matched elements. + /// One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert at the beginning of each element in the set of matched elements. + /// + /// + /// + /// Insert content, specified by the parameter, to the beginning of each element in the set of matched elements. + /// A function that returns an HTML string, DOM element(s), or jQuery object to insert at the beginning of each element in the set of matched elements. Receives the index position of the element in the set and the old HTML value of the element as arguments. Within the function, this refers to the current element in the set. + /// + /// + }, + 'prependTo': function() { + /// + /// Insert every element in the set of matched elements to the beginning of the target. + /// A selector, element, HTML string, or jQuery object; the matched set of elements will be inserted at the beginning of the element(s) specified by this parameter. + /// + /// + }, + 'prev': function() { + /// + /// Get the immediately preceding sibling of each element in the set of matched elements, optionally filtered by a selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'prevAll': function() { + /// + /// Get all preceding siblings of each element in the set of matched elements, optionally filtered by a selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'prevUntil': function() { + /// + /// Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object. + /// A string containing a selector expression to indicate where to stop matching preceding sibling elements. + /// A string containing a selector expression to match elements against. + /// + /// + /// + /// Get all preceding siblings of each element up to but not including the element matched by the selector, DOM node, or jQuery object. + /// A DOM node or jQuery object indicating where to stop matching preceding sibling elements. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'promise': function() { + /// + /// Return a Promise object to observe when all actions of a certain type bound to the collection, queued or not, have finished. + /// The type of queue that needs to be observed. + /// Object onto which the promise methods have to be attached + /// + /// + }, + 'prop': function() { + /// + /// Set one or more properties for the set of matched elements. + /// The name of the property to set. + /// A value to set for the property. + /// + /// + /// + /// Set one or more properties for the set of matched elements. + /// A map of property-value pairs to set. + /// + /// + /// + /// Set one or more properties for the set of matched elements. + /// The name of the property to set. + /// A function returning the value to set. Receives the index position of the element in the set and the old property value as arguments. Within the function, the keyword this refers to the current element. + /// + /// + }, + 'pushStack': function() { + /// + /// Add a collection of DOM elements onto the jQuery stack. + /// An array of elements to push onto the stack and make into a new jQuery object. + /// + /// + /// + /// Add a collection of DOM elements onto the jQuery stack. + /// An array of elements to push onto the stack and make into a new jQuery object. + /// The name of a jQuery method that generated the array of elements. + /// The arguments that were passed in to the jQuery method (for serialization). + /// + /// + }, + 'queue': function() { + /// + /// Manipulate the queue of functions to be executed on the matched elements. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// An array of functions to replace the current queue contents. + /// + /// + /// + /// Manipulate the queue of functions to be executed on the matched elements. + /// A string containing the name of the queue. Defaults to fx, the standard effects queue. + /// The new function to add to the queue, with a function to call that will dequeue the next item. + /// + /// + }, + 'radio': function() { + /// Selects all elements of type radio. + }, + 'ready': function() { + /// + /// Specify a function to execute when the DOM is fully loaded. + /// A function to execute after the DOM is ready. + /// + /// + }, + 'remove': function() { + /// + /// Remove the set of matched elements from the DOM. + /// A selector expression that filters the set of matched elements to be removed. + /// + /// + }, + 'removeAttr': function() { + /// + /// Remove an attribute from each element in the set of matched elements. + /// An attribute to remove; as of version 1.7, it can be a space-separated list of attributes. + /// + /// + }, + 'removeClass': function() { + /// + /// Remove a single class, multiple classes, or all classes from each element in the set of matched elements. + /// One or more space-separated classes to be removed from the class attribute of each matched element. + /// + /// + /// + /// Remove a single class, multiple classes, or all classes from each element in the set of matched elements. + /// A function returning one or more space-separated class names to be removed. Receives the index position of the element in the set and the old class value as arguments. + /// + /// + }, + 'removeData': function() { + /// + /// Remove a previously-stored piece of data. + /// A string naming the piece of data to delete. + /// + /// + /// + /// Remove a previously-stored piece of data. + /// An array or space-separated string naming the pieces of data to delete. + /// + /// + }, + 'removeProp': function() { + /// + /// Remove a property for the set of matched elements. + /// The name of the property to set. + /// + /// + }, + 'replaceAll': function() { + /// + /// Replace each target element with the set of matched elements. + /// A selector expression indicating which element(s) to replace. + /// + /// + }, + 'replaceWith': function() { + /// + /// Replace each element in the set of matched elements with the provided new content. + /// The content to insert. May be an HTML string, DOM element, or jQuery object. + /// + /// + /// + /// Replace each element in the set of matched elements with the provided new content. + /// A function that returns content with which to replace the set of matched elements. + /// + /// + }, + 'reset': function() { + /// Selects all elements of type reset. + }, + 'resize': function() { + /// + /// Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "resize" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'scroll': function() { + /// + /// Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "scroll" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'scrollLeft': function() { + /// + /// Set the current horizontal position of the scroll bar for each of the set of matched elements. + /// An integer indicating the new position to set the scroll bar to. + /// + /// + }, + 'scrollTop': function() { + /// + /// Set the current vertical position of the scroll bar for each of the set of matched elements. + /// An integer indicating the new position to set the scroll bar to. + /// + /// + }, + 'select': function() { + /// + /// Bind an event handler to the "select" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "select" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'selected': function() { + /// Selects all elements that are selected. + }, + 'serialize': function() { + /// Encode a set of form elements as a string for submission. + /// + }, + 'serializeArray': function() { + /// Encode a set of form elements as an array of names and values. + /// + }, + 'show': function() { + /// + /// Display the matched elements. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Display the matched elements. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'siblings': function() { + /// + /// Get the siblings of each element in the set of matched elements, optionally filtered by a selector. + /// A string containing a selector expression to match elements against. + /// + /// + }, + 'size': function() { + /// Return the number of elements in the jQuery object. + /// + }, + 'slice': function() { + /// + /// Reduce the set of matched elements to a subset specified by a range of indices. + /// An integer indicating the 0-based position at which the elements begin to be selected. If negative, it indicates an offset from the end of the set. + /// An integer indicating the 0-based position at which the elements stop being selected. If negative, it indicates an offset from the end of the set. If omitted, the range continues until the end of the set. + /// + /// + }, + 'slideDown': function() { + /// + /// Display the matched elements with a sliding motion. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Display the matched elements with a sliding motion. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'slideToggle': function() { + /// + /// Display or hide the matched elements with a sliding motion. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Display or hide the matched elements with a sliding motion. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'slideUp': function() { + /// + /// Hide the matched elements with a sliding motion. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Hide the matched elements with a sliding motion. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + }, + 'stop': function() { + /// + /// Stop the currently-running animation on the matched elements. + /// A Boolean indicating whether to remove queued animation as well. Defaults to false. + /// A Boolean indicating whether to complete the current animation immediately. Defaults to false. + /// + /// + /// + /// Stop the currently-running animation on the matched elements. + /// The name of the queue in which to stop animations. + /// A Boolean indicating whether to remove queued animation as well. Defaults to false. + /// A Boolean indicating whether to complete the current animation immediately. Defaults to false. + /// + /// + }, + 'submit': function() { + /// + /// Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. + /// A function to execute each time the event is triggered. + /// + /// + /// + /// Bind an event handler to the "submit" JavaScript event, or trigger that event on an element. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'text': function() { + /// + /// Set the content of each element in the set of matched elements to the specified text. + /// A string of text to set as the content of each matched element. + /// + /// + /// + /// Set the content of each element in the set of matched elements to the specified text. + /// A function returning the text content to set. Receives the index position of the element in the set and the old text value as arguments. + /// + /// + }, + 'toArray': function() { + /// Retrieve all the DOM elements contained in the jQuery set, as an array. + /// + }, + 'toggle': function() { + /// + /// Display or hide the matched elements. + /// A string or number determining how long the animation will run. + /// A function to call once the animation is complete. + /// + /// + /// + /// Display or hide the matched elements. + /// A string or number determining how long the animation will run. + /// A string indicating which easing function to use for the transition. + /// A function to call once the animation is complete. + /// + /// + /// + /// Display or hide the matched elements. + /// A Boolean indicating whether to show or hide the elements. + /// + /// + }, + 'toggleClass': function() { + /// + /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. + /// One or more class names (separated by spaces) to be toggled for each element in the matched set. + /// + /// + /// + /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. + /// One or more class names (separated by spaces) to be toggled for each element in the matched set. + /// A Boolean (not just truthy/falsy) value to determine whether the class should be added or removed. + /// + /// + /// + /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. + /// A boolean value to determine whether the class should be added or removed. + /// + /// + /// + /// Add or remove one or more classes from each element in the set of matched elements, depending on either the class's presence or the value of the switch argument. + /// A function that returns class names to be toggled in the class attribute of each element in the matched set. Receives the index position of the element in the set, the old class value, and the switch as arguments. + /// A boolean value to determine whether the class should be added or removed. + /// + /// + }, + 'trigger': function() { + /// + /// Execute all handlers and behaviors attached to the matched elements for the given event type. + /// A string containing a JavaScript event type, such as click or submit. + /// Additional parameters to pass along to the event handler. + /// + /// + /// + /// Execute all handlers and behaviors attached to the matched elements for the given event type. + /// A jQuery.Event object. + /// + /// + }, + 'triggerHandler': function() { + /// + /// Execute all handlers attached to an element for an event. + /// A string containing a JavaScript event type, such as click or submit. + /// An array of additional parameters to pass along to the event handler. + /// + /// + }, + 'unbind': function() { + /// + /// Remove a previously-attached event handler from the elements. + /// A string containing a JavaScript event type, such as click or submit. + /// The function that is to be no longer executed. + /// + /// + /// + /// Remove a previously-attached event handler from the elements. + /// A string containing a JavaScript event type, such as click or submit. + /// Unbinds the corresponding 'return false' function that was bound using .bind( eventType, false ). + /// + /// + /// + /// Remove a previously-attached event handler from the elements. + /// A JavaScript event object as passed to an event handler. + /// + /// + }, + 'undelegate': function() { + /// + /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. + /// A selector which will be used to filter the event results. + /// A string containing a JavaScript event type, such as "click" or "keydown" + /// + /// + /// + /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. + /// A selector which will be used to filter the event results. + /// A string containing a JavaScript event type, such as "click" or "keydown" + /// A function to execute at the time the event is triggered. + /// + /// + /// + /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. + /// A selector which will be used to filter the event results. + /// A map of one or more event types and previously bound functions to unbind from them. + /// + /// + /// + /// Remove a handler from the event for all elements which match the current selector, based upon a specific set of root elements. + /// A string containing a namespace to unbind all events from. + /// + /// + }, + 'unload': function() { + /// + /// Bind an event handler to the "unload" JavaScript event. + /// A function to execute when the event is triggered. + /// + /// + /// + /// Bind an event handler to the "unload" JavaScript event. + /// A map of data that will be passed to the event handler. + /// A function to execute each time the event is triggered. + /// + /// + }, + 'unwrap': function() { + /// Remove the parents of the set of matched elements from the DOM, leaving the matched elements in their place. + /// + }, + 'val': function() { + /// + /// Set the value of each element in the set of matched elements. + /// A string of text or an array of strings corresponding to the value of each matched element to set as selected/checked. + /// + /// + /// + /// Set the value of each element in the set of matched elements. + /// A function returning the value to set. this is the current element. Receives the index position of the element in the set and the old value as arguments. + /// + /// + }, + 'visible': function() { + /// Selects all elements that are visible. + }, + 'width': function() { + /// + /// Set the CSS width of each element in the set of matched elements. + /// An integer representing the number of pixels, or an integer along with an optional unit of measure appended (as a string). + /// + /// + /// + /// Set the CSS width of each element in the set of matched elements. + /// A function returning the width to set. Receives the index position of the element in the set and the old width as arguments. Within the function, this refers to the current element in the set. + /// + /// + }, + 'wrap': function() { + /// + /// Wrap an HTML structure around each element in the set of matched elements. + /// An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements. + /// + /// + /// + /// Wrap an HTML structure around each element in the set of matched elements. + /// A callback function returning the HTML content or jQuery object to wrap around the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. + /// + /// + }, + 'wrapAll': function() { + /// + /// Wrap an HTML structure around all elements in the set of matched elements. + /// An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the matched elements. + /// + /// + }, + 'wrapInner': function() { + /// + /// Wrap an HTML structure around the content of each element in the set of matched elements. + /// An HTML snippet, selector expression, jQuery object, or DOM element specifying the structure to wrap around the content of the matched elements. + /// + /// + /// + /// Wrap an HTML structure around the content of each element in the set of matched elements. + /// A callback function which generates a structure to wrap around the content of the matched elements. Receives the index position of the element in the set as an argument. Within the function, this refers to the current element in the set. + /// + /// + }, +}); + +intellisense.annotate(window, { + '$': function() { + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// A string containing a selector expression + /// A DOM Element, Document, or jQuery to use as context + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// A DOM element to wrap in a jQuery object. + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// A plain object to wrap in a jQuery object. + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// An array containing a set of DOM elements to wrap in a jQuery object. + /// + /// + /// + /// Accepts a string containing a CSS selector which is then used to match a set of elements. + /// An existing jQuery object to clone. + /// + /// + }, +}); + diff --git a/Sample.WebForms-NET35/Scripts/jquery-1.7.1.js b/Sample.WebForms-NET35/Scripts/jquery-1.7.1.js new file mode 100644 index 0000000..b4ec7f8 --- /dev/null +++ b/Sample.WebForms-NET35/Scripts/jquery-1.7.1.js @@ -0,0 +1,9266 @@ +/*! + * jQuery JavaScript Library v1.7.1 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Released under the the MIT License. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT and BSD Licenses. + * + * Date: Mon Nov 21 21:11:03 2011 -0500 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document, + navigator = window.navigator, + location = window.location; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.1", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +return jQuery; + +})(); + + +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!memory; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } +}); + + + + +jQuery.support = (function() { + + var support, + all, + a, + select, + opt, + input, + marginDiv, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true + }; + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = marginDiv = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + conMarginTop, ptlm, vb, style, html, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;"; + vb = "visibility:hidden;border:0;"; + style = "style='" + ptlm + "border:5px solid #000;padding:0;'"; + html = "
" + + "" + + "
"; + + container = document.createElement("div"); + container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
t
"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Figure out if the W3C box model works as expected + div.innerHTML = ""; + div.style.width = div.style.paddingLeft = "1px"; + jQuery.boxModel = support.boxModel = div.offsetWidth === 2; + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); + } + + div.style.cssText = ptlm + vb; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + body.removeChild( container ); + div = container = null; + + jQuery.extend( support, offsetSupport ); + }); + + return support; +})(); + + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/, + rmultiDash = /([A-Z])/g; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var parts, attr, name, + data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) { + attr = this[0].attributes; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( this[0], name, data[ name ] ); + } + } + jQuery._data( this[0], "parsedAttrs", true ); + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var self = jQuery( this ), + args = [ parts[0], value ]; + + self.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +function handleQueueMarkDefer( elem, type, src ) { + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } +} + +jQuery.extend({ + + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise(); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.prop ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + + // See #9699 for explanation of this approach (setting first, then removal) + jQuery.attr( elem, name, "" ); + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( rboolean.test( name ) && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } +}); + +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; + +// Hook for boolean attributes +boolHook = { + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } +}; + +// IE6/7 do not support getting/setting some attributes with get/setAttribute +if ( !getSetAttribute ) { + + fixSpecified = { + name: true, + id: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; +} + + +// Some attributes require a special call on IE +if ( !jQuery.support.hrefNormalized ) { + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); +} + +if ( !jQuery.support.style ) { + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; +} + +// Safari mis-reports the default selected property of an option +// Accessing the parent's selectedIndex property fixes it +if ( !jQuery.support.optSelected ) { + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; +} + +// Radios and checkboxes getter/setter +if ( !jQuery.support.checkOn ) { + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); +} +jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); +}); + + + + +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /\bhover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Determine handlers that should run if there are delegated events + // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src, props ) { + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +}); + +// IE submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !jQuery.support.changeBubbles ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; +} + +// Create "bubbling" focus and blur events +if ( !jQuery.support.focusinBubbles ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} + +jQuery.fn.extend({ + + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + // ( types-Object, data ) + data = selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on.call( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } +}); + + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set, i, len, match, type, left; + + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); +} + + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and "; - - /// - /// You can wrap an html block with timing wrappers using this helper - /// - public static string TimeScript(string name, string html) - { - if (MiniProfiler.Current != null) - { - name = name.Replace("'", "\\'"); - var probe = ""; - html = probe + html + probe; - } - return html; - } - - /// - /// This needs to be called at the begining of the layout for client side probe support, returns nothing if mini profiler is not enabled - /// - public static IHtmlString InitClientTimings(this WebPageBase page) - { - if (MiniProfiler.Current == null) return null; - return new HtmlString(InitScript); - } - - /// - /// To be used inline in razor pages - times a script be sure to call InitClientTimings first - /// - public static IHtmlString TimeScript(this WebPageBase page, string name, Func html) - { - var result = html(null).ToHtmlString(); - return new HtmlString(TimeScript(name, result)); - } - - /// - /// To be used inline in razor pages - times a script be sure to call InitClientTimings first - /// - public static IHtmlString TimeScript(this WebPageBase page, string name, IHtmlString html) - { - return new HtmlString(TimeScript(name, html.ToHtmlString())); - } - - /// - /// To be used inline in razor pages - times a script be sure to call InitClientTimings first - /// - public static IHtmlString TimeScript(this WebPageBase page, string name, string html) - { - return new HtmlString(TimeScript(name, html)); - } - } -} diff --git a/StackExchange.Profiling/Helpers/ExtensionMethods.cs b/StackExchange.Profiling/Helpers/ExtensionMethods.cs index 1eadbac..c5c59b2 100644 --- a/StackExchange.Profiling/Helpers/ExtensionMethods.cs +++ b/StackExchange.Profiling/Helpers/ExtensionMethods.cs @@ -17,7 +17,7 @@ internal static class ExtensionMethods ///
internal static bool IsNullOrWhiteSpace(this string s) { - return string.IsNullOrWhiteSpace(s); + return s == null || string.IsNullOrEmpty(s.Trim()); } /// @@ -25,7 +25,7 @@ internal static bool IsNullOrWhiteSpace(this string s) /// internal static bool HasValue(this string s) { - return !string.IsNullOrWhiteSpace(s); + return !s.IsNullOrWhiteSpace(); } internal static string Truncate(this string s, int maxLength) diff --git a/StackExchange.Profiling/Helpers/StackTraceSnippet.cs b/StackExchange.Profiling/Helpers/StackTraceSnippet.cs deleted file mode 100644 index ae09ba7..0000000 --- a/StackExchange.Profiling/Helpers/StackTraceSnippet.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; - -namespace StackExchange.Profiling.Helpers -{ - /// - /// Gets part of a stack trace containing only methods we care about. - /// - public class StackTraceSnippet - { - private const string AspNetEntryPointMethodName = "System.Web.HttpApplication.IExecutionStep.Execute"; - - /// - /// Gets the current formatted and filted stack trace. - /// - /// Space separated list of methods - public static string Get() - { - var frames = new StackTrace().GetFrames(); - if (frames == null) - { - return ""; - } - - var methods = new List(); - - foreach (StackFrame t in frames) - { - var method = t.GetMethod(); - - // no need to continue up the chain - if (method.Name == AspNetEntryPointMethodName) - break; - - var assembly = method.Module.Assembly.GetName().Name; - if (!MiniProfiler.Settings.AssembliesToExclude.Contains(assembly) && - !ShouldExcludeType(method) && - !MiniProfiler.Settings.MethodsToExclude.Contains(method.Name)) - { - methods.Add(method.Name); - } - } - - var result = string.Join(" ", methods); - - if (result.Length > MiniProfiler.Settings.StackMaxLength) - { - var index = result.IndexOf(" ", MiniProfiler.Settings.StackMaxLength); - if (index >= MiniProfiler.Settings.StackMaxLength) - { - result = result.Substring(0, index); - } - } - - return result; - } - - private static bool ShouldExcludeType(MethodBase method) - { - var t = method.DeclaringType; - - while (t != null) - { - if (MiniProfiler.Settings.TypesToExclude.Contains(t.Name)) - return true; - - t = t.DeclaringType; - } - return false; - } - } -} diff --git a/StackExchange.Profiling/StackExchange.Profiling.csproj b/StackExchange.Profiling/StackExchange.Profiling.csproj index 8c852d9..ef41743 100644 --- a/StackExchange.Profiling/StackExchange.Profiling.csproj +++ b/StackExchange.Profiling/StackExchange.Profiling.csproj @@ -59,56 +59,15 @@
- - IProfilerProvider.cs - - - - Code - - + - - - - IUserProvider.cs - - - - Code - - - MiniProfiler.cs - - - MiniProfiler.cs - - - - - - - - - SqlTiming.cs - - - - - - - - - - WebRequestProfilerProvider.cs - @@ -136,6 +95,10 @@ {44612123-b2e2-458a-859f-7077134d31c8} StackExchange.Profiling.AdoNet
+ + {ab77f5b3-615e-446b-9905-833fdef734a0} + StackExchange.Profiling35 +
diff --git a/StackExchange.Profiling/WebRequestProfilerProvider.cs b/StackExchange.Profiling/WebRequestProfilerProvider.cs index c52ce43..50a6fad 100644 --- a/StackExchange.Profiling/WebRequestProfilerProvider.cs +++ b/StackExchange.Profiling/WebRequestProfilerProvider.cs @@ -13,109 +13,8 @@ namespace StackExchange.Profiling /// The current profiler is associated with a HttpContext.Current ensuring that profilers are /// specific to a individual HttpRequest. ///
- public partial class WebRequestProfilerProvider : BaseProfilerProvider + public partial class WebRequestProfilerProvider40 : WebRequestProfilerProvider { - /// - /// Public constructor. This also registers any UI routes needed to display results - /// - public WebRequestProfilerProvider() - { - UI.MiniProfilerHandler.RegisterRoutes(); - } - - /// - /// Starts a new MiniProfiler and associates it with the current . - /// - public override MiniProfiler Start(ProfileLevel level) - { - var context = HttpContext.Current; - if (context == null) return null; - - var url = context.Request.Url; - var path = context.Request.AppRelativeCurrentExecutionFilePath.Substring(1).ToUpperInvariant(); - - // don't profile /content or /scripts, either - happens in web.dev - foreach (var ignored in StackExchange.Profiling.MiniProfiler.Settings.IgnoredPaths ?? new string[0]) - { - if (path.Contains((ignored ?? "").ToUpperInvariant())) - return null; - } - - if (context.Request.Path.StartsWith(VirtualPathUtility.ToAbsolute(MiniProfiler.Settings.RouteBasePath), StringComparison.InvariantCultureIgnoreCase)) - { - return null; - } - - var result = new MiniProfiler(url.OriginalString, level); - Current = result; - - SetProfilerActive(result); - - // don't really want to pass in the context to MiniProfler's constructor or access it statically in there, either - result.User = Settings.UserProvider.GetUser(context.Request); - - return result; - } - - - /// - /// Ends the current profiling session, if one exists. - /// - /// - /// When true, clears the for this HttpContext, allowing profiling to - /// be prematurely stopped and discarded. Useful for when a specific route does not need to be profiled. - /// - public override void Stop(bool discardResults) - { - var context = HttpContext.Current; - if (context == null) - return; - - var current = Current; - if (current == null) - return; - - // stop our timings - when this is false, we've already called .Stop before on this session - if (!StopProfiler(current)) - return; - - if (discardResults) - { - Current = null; - return; - } - - var request = context.Request; - var response = context.Response; - - // set the profiler name to Controller/Action or /url - EnsureName(current, request); - - // save the profiler - SaveProfiler(current); - - try - { - var arrayOfIds = StackExchange.Profiling.MiniProfiler.Settings.Storage.GetUnviewedIds(current.User); - - if (arrayOfIds != null && arrayOfIds.Count > MiniProfiler.Settings.MaxUnviewedProfiles) - { - foreach (var id in arrayOfIds.Take(arrayOfIds.Count - MiniProfiler.Settings.MaxUnviewedProfiles)) - { - StackExchange.Profiling.MiniProfiler.Settings.Storage.SetViewed(current.User, id); - } - } - - // allow profiling of ajax requests - if (arrayOfIds != null && arrayOfIds.Count > 0) - { - response.AppendHeader("X-MiniProfiler-Ids", arrayOfIds.ToJson()); - } - } - catch { } // headers blew up - } - - /// /// Makes sure 'profiler' has a Name, pulling it from route data or url. /// @@ -146,36 +45,15 @@ private static void EnsureName(MiniProfiler profiler, HttpRequest request) } /// - /// Returns the current profiler - /// - /// - public override MiniProfiler GetCurrentProfiler() - { - return Current; - } - - - private const string CacheKey = ":mini-profiler:"; - - /// - /// Gets the currently running MiniProfiler for the current HttpContext; null if no MiniProfiler was ed. + /// Ends the current profiling session, if one exists. /// - private MiniProfiler Current + /// + /// When true, clears the for this HttpContext, allowing profiling to + /// be prematurely stopped and discarded. Useful for when a specific route does not need to be profiled. + /// + public override void Stop(bool discardResults) { - get - { - var context = HttpContext.Current; - if (context == null) return null; - - return context.Items[CacheKey] as MiniProfiler; - } - set - { - var context = HttpContext.Current; - if (context == null) return; - - context.Items[CacheKey] = value; - } + Stop(discardResults, EnsureName); } } -} +} \ No newline at end of file diff --git a/StackExchange.Profiling/BaseProfilerProvider.cs b/StackExchange.Profiling35/BaseProfilerProvider.cs similarity index 100% rename from StackExchange.Profiling/BaseProfilerProvider.cs rename to StackExchange.Profiling35/BaseProfilerProvider.cs diff --git a/StackExchange.Profiling/ClientTimings.cs b/StackExchange.Profiling35/ClientTimings.cs similarity index 94% rename from StackExchange.Profiling/ClientTimings.cs rename to StackExchange.Profiling35/ClientTimings.cs index cf86920..ad21338 100644 --- a/StackExchange.Profiling/ClientTimings.cs +++ b/StackExchange.Profiling35/ClientTimings.cs @@ -63,9 +63,9 @@ public static ClientTimings FromRequest(HttpRequest request) timing.RedirectCount = redirectCount; Dictionary clientPerf = new Dictionary(); - Dictionary clientProbes = new Dictionary(); + Dictionary clientProbes = new Dictionary(); - foreach (string key in request.Form.Keys.Cast().OrderBy(i => i.IndexOf("Start]") > 0 ? "_" + i : i )) + foreach (string key in request.Form.Keys.Cast().OrderBy(i => i.IndexOf("Start]") > 0 ? "_" + i : i)) { if (key.StartsWith(clientTimingPrefix)) { @@ -73,14 +73,14 @@ public static ClientTimings FromRequest(HttpRequest request) long.TryParse(request[key], out val); val -= navigationStart; - string parsedName = key.Substring(clientTimingPrefix.Length, (key.Length-1) - clientTimingPrefix.Length); + string parsedName = key.Substring(clientTimingPrefix.Length, (key.Length - 1) - clientTimingPrefix.Length); // just ignore stuff that is negative ... not relevant if (val > 0) { if (parsedName.EndsWith("Start")) { var shortName = parsedName.Substring(0, parsedName.Length - 5); - clientPerf[shortName] = new ClientTiming {Duration = -1, Name = parsedName, Start = val}; + clientPerf[shortName] = new ClientTiming { Duration = -1, Name = parsedName, Start = val }; } else if (parsedName.EndsWith("End")) { @@ -100,7 +100,7 @@ public static ClientTimings FromRequest(HttpRequest request) } if (key.StartsWith(clientProbesPrefix)) - { + { int probeId; if (key.IndexOf("]") > 0 && int.TryParse(key.Substring(clientProbesPrefix.Length, key.IndexOf("]") - clientProbesPrefix.Length), out probeId)) { @@ -115,7 +115,7 @@ public static ClientTimings FromRequest(HttpRequest request) { t.Name = request[key]; } - if (key.EndsWith("[d]")) + if (key.EndsWith("[d]")) { long val = 0; long.TryParse(request[key], out val); @@ -169,7 +169,7 @@ private static string SentenceCase(string s) sb.Append(Char.ToUpper(s[0])); continue; } - else if (s[i] == char.ToUpper(s[i])) + else if (s[i] == char.ToUpper(s[i])) { sb.Append(' '); } @@ -177,7 +177,7 @@ private static string SentenceCase(string s) } return sb.ToString(); } - + /// /// Stores information about client perf /// diff --git a/StackExchange.Profiling35/Helpers/ExtensionMethods.cs b/StackExchange.Profiling35/Helpers/ExtensionMethods.cs new file mode 100644 index 0000000..c5c59b2 --- /dev/null +++ b/StackExchange.Profiling35/Helpers/ExtensionMethods.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Web.Script.Serialization; + +namespace StackExchange.Profiling.Helpers +{ + /// + /// Common extension methods to use only in this project + /// + internal static class ExtensionMethods + { + /// + /// Answers true if this String is either null or empty. + /// + internal static bool IsNullOrWhiteSpace(this string s) + { + return s == null || string.IsNullOrEmpty(s.Trim()); + } + + /// + /// Answers true if this String is neither null or empty. + /// + internal static bool HasValue(this string s) + { + return !s.IsNullOrWhiteSpace(); + } + + internal static string Truncate(this string s, int maxLength) + { + return s != null && s.Length > maxLength ? s.Substring(0, maxLength) : s; + } + + /// + /// Removes trailing / characters from a path and leaves just one + /// + internal static string EnsureTrailingSlash(this string input) + { + if (string.IsNullOrEmpty(input)) return ""; + return Regex.Replace(input, "/+$", "") + "/"; + } + + /// + /// Removes any leading / characters from a path + /// + internal static string RemoveLeadingSlash(this string input) + { + if (string.IsNullOrEmpty(input)) return ""; + return Regex.Replace(input, "^/+", ""); + } + + /// + /// Removes any leading / characters from a path + /// + internal static string RemoveTrailingSlash(this string input) + { + if (string.IsNullOrEmpty(input)) return ""; + return Regex.Replace(input, "/+$", ""); + } + + /// + /// Serializes to a json string. + /// + internal static string ToJson(this object o) + { + if (o == null) return null; + return new JavaScriptSerializer().Serialize(o); + } + } +} diff --git a/StackExchange.Profiling/Helpers/HaackFormatter.cs b/StackExchange.Profiling35/Helpers/HaackFormatter.cs similarity index 100% rename from StackExchange.Profiling/Helpers/HaackFormatter.cs rename to StackExchange.Profiling35/Helpers/HaackFormatter.cs diff --git a/StackExchange.Profiling/Helpers/IStopwatch.cs b/StackExchange.Profiling35/Helpers/IStopWatch.cs similarity index 99% rename from StackExchange.Profiling/Helpers/IStopwatch.cs rename to StackExchange.Profiling35/Helpers/IStopWatch.cs index c06ecd7..eac88e4 100644 --- a/StackExchange.Profiling/Helpers/IStopwatch.cs +++ b/StackExchange.Profiling35/Helpers/IStopWatch.cs @@ -6,7 +6,6 @@ namespace StackExchange.Profiling.Helpers { - internal interface IStopwatch { long ElapsedTicks { get; } diff --git a/StackExchange.Profiling35/Helpers/StackTraceSnippet.cs b/StackExchange.Profiling35/Helpers/StackTraceSnippet.cs new file mode 100644 index 0000000..ee82f52 --- /dev/null +++ b/StackExchange.Profiling35/Helpers/StackTraceSnippet.cs @@ -0,0 +1,74 @@ +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; + +namespace StackExchange.Profiling.Helpers +{ + /// + /// Gets part of a stack trace containing only methods we care about. + /// + public class StackTraceSnippet + { + private const string AspNetEntryPointMethodName = "System.Web.HttpApplication.IExecutionStep.Execute"; + + /// + /// Gets the current formatted and filted stack trace. + /// + /// Space separated list of methods + public static string Get() + { + var frames = new StackTrace().GetFrames(); + if (frames == null) + { + return ""; + } + + var methods = new List(); + + foreach (StackFrame t in frames) + { + var method = t.GetMethod(); + + // no need to continue up the chain + if (method.Name == AspNetEntryPointMethodName) + break; + + var assembly = method.Module.Assembly.GetName().Name; + if (!MiniProfiler.Settings.AssembliesToExclude.Contains(assembly) && + !ShouldExcludeType(method) && + !MiniProfiler.Settings.MethodsToExclude.Contains(method.Name)) + { + methods.Add(method.Name); + } + } + + var result = string.Join(" ", methods.ToArray()); + + if (result.Length > MiniProfiler.Settings.StackMaxLength) + { + var index = result.IndexOf(" ", MiniProfiler.Settings.StackMaxLength); + if (index >= MiniProfiler.Settings.StackMaxLength) + { + result = result.Substring(0, index); + } + } + + return result; + } + + private static bool ShouldExcludeType(MethodBase method) + { + var t = method.DeclaringType; + + while (t != null) + { + if (MiniProfiler.Settings.TypesToExclude.Contains(t.Name)) + return true; + + t = t.DeclaringType; + } + return false; + } + } +} diff --git a/StackExchange.Profiling35/Helpers/Tuples.cs b/StackExchange.Profiling35/Helpers/Tuples.cs new file mode 100644 index 0000000..6cd1a74 --- /dev/null +++ b/StackExchange.Profiling35/Helpers/Tuples.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace StackExchange.Profiling.Helpers +{ + public class Tuple + { + public Tuple(T1 item1) + { + Item1 = item1; + } + + public T1 Item1 { get; set; } + } + + public class Tuple : Tuple + { + public Tuple(T1 item1, T2 item2) + : base(item1) + { + Item2 = item2; + } + + public T2 Item2 { get; set; } + } + + public class Tuple : Tuple + { + public Tuple(T1 item1, T2 item2, T3 item3) + : base(item1, item2) + { + Item3 = item3; + } + + public T3 Item3 { get; set; } + } + + public static class Tuple + { + public static Tuple Create(T1 item1) + { + return new Tuple(item1); + } + + public static Tuple Create(T1 item1, T2 item2) + { + return new Tuple(item1, item2); + } + + public static Tuple Create(T1 item1, T2 item2, T3 item3) + { + return new Tuple(item1, item2, item3); + } + } +} diff --git a/StackExchange.Profiling/IProfilerProvider.cs b/StackExchange.Profiling35/IProfilerProvider.cs similarity index 100% rename from StackExchange.Profiling/IProfilerProvider.cs rename to StackExchange.Profiling35/IProfilerProvider.cs diff --git a/StackExchange.Profiling/IUserProvider.cs b/StackExchange.Profiling35/IUserProvider.cs similarity index 100% rename from StackExchange.Profiling/IUserProvider.cs rename to StackExchange.Profiling35/IUserProvider.cs diff --git a/StackExchange.Profiling/IpAddressProvider.cs b/StackExchange.Profiling35/IpAddressProvider.cs similarity index 100% rename from StackExchange.Profiling/IpAddressProvider.cs rename to StackExchange.Profiling35/IpAddressProvider.cs diff --git a/StackExchange.Profiling/MiniProfiler.IDbProfiler.cs b/StackExchange.Profiling35/MiniProfiler.IDbProfiler.cs similarity index 100% rename from StackExchange.Profiling/MiniProfiler.IDbProfiler.cs rename to StackExchange.Profiling35/MiniProfiler.IDbProfiler.cs diff --git a/StackExchange.Profiling/MiniProfiler.Settings.cs b/StackExchange.Profiling35/MiniProfiler.Settings.cs similarity index 98% rename from StackExchange.Profiling/MiniProfiler.Settings.cs rename to StackExchange.Profiling35/MiniProfiler.Settings.cs index 002f47b..67c42f6 100644 --- a/StackExchange.Profiling/MiniProfiler.Settings.cs +++ b/StackExchange.Profiling35/MiniProfiler.Settings.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.ComponentModel; @@ -37,7 +37,7 @@ where p.IsDefined(t, inherit: false) string location; try { - location = typeof (Settings).Assembly.Location; + location = typeof(Settings).Assembly.Location; } catch { @@ -55,7 +55,7 @@ where p.IsDefined(t, inherit: false) if (System.IO.Directory.Exists(customUITemplatesPath)) { - files.AddRange(System.IO.Directory.EnumerateFiles(customUITemplatesPath)); + files.AddRange(System.IO.Directory.GetFiles(customUITemplatesPath)); } using (var sha256 = new System.Security.Cryptography.SHA256CryptoServiceProvider()) @@ -334,7 +334,7 @@ internal static void EnsureProfilerProvider() /// Allows switching out stopwatches for unit testing. /// internal static Func StopwatchProvider { get; set; } - + } } } diff --git a/StackExchange.Profiling/MiniProfiler.cs b/StackExchange.Profiling35/MiniProfiler.cs similarity index 92% rename from StackExchange.Profiling/MiniProfiler.cs rename to StackExchange.Profiling35/MiniProfiler.cs index b3bf489..9c7d7d8 100644 --- a/StackExchange.Profiling/MiniProfiler.cs +++ b/StackExchange.Profiling35/MiniProfiler.cs @@ -5,6 +5,7 @@ using System.Runtime.Serialization; using System.Text; using System.Web; +using System.Web.Mvc; using System.Web.Routing; using System.Web.Script.Serialization; using StackExchange.Profiling.Helpers; @@ -327,17 +328,7 @@ public static IDisposable StepStatic(string name, ProfileLevel level = ProfileLe return MiniProfilerExtensions.Step(Current, name, level); } - /// - /// Returns the css and javascript includes needed to display the MiniProfiler results UI. - /// - /// Which side of the page the profiler popup button should be displayed on (defaults to left) - /// Whether to show trivial timings by default (defaults to false) - /// Whether to show time the time with children column by default (defaults to false) - /// The maximum number of trace popups to show before removing the oldest (defaults to 15) - /// when true, shows buttons to minimize and clear MiniProfiler results - /// Whether MiniProfiler should attempt to load its own version of jQuery, or rely on a version previously loaded on the page - /// Script and link elements normally; an empty string when there is no active profiling session. - public static IHtmlString RenderIncludes(RenderPosition? position = null, bool? showTrivial = null, bool? showTimeWithChildren = null, int? maxTracesToShow = null, bool? showControls = null, bool? useExistingjQuery = null, bool samplingOnly = false) + public static MvcHtmlString RenderIncludes(RenderPosition? position = null, bool? showTrivial = null, bool? showTimeWithChildren = null, int? maxTracesToShow = null, bool? showControls = null, bool? useExistingjQuery = null, bool samplingOnly = false) { return UI.MiniProfilerHandler.RenderIncludes(Current, position, showTrivial, showTimeWithChildren, maxTracesToShow, showControls, useExistingjQuery); } @@ -379,7 +370,7 @@ public static string ToJson(MiniProfiler profiler) /// public static MiniProfiler FromJson(string json) { - if (string.IsNullOrWhiteSpace(json)) return null; + if (json.IsNullOrWhiteSpace()) return null; var result = new JavaScriptSerializer { MaxJsonLength = MiniProfiler.Settings.MaxJsonResponseSize }.Deserialize(json); return result; @@ -410,7 +401,7 @@ public MiniProfiler Clone() return (MiniProfiler)serializer.ReadObject(ms); } } - + } /// @@ -500,9 +491,9 @@ public static void AddProfilerResults(this MiniProfiler profiler, MiniProfiler e /// Returns an html-encoded string with a text-representation of ; returns "" when profiler is null. /// /// The current profiling session or null. - public static IHtmlString Render(this MiniProfiler profiler) + public static MvcHtmlString Render(this MiniProfiler profiler) { - if (profiler == null) return new HtmlString(""); + if (profiler == null) return MvcHtmlString.Empty; var text = new StringBuilder() .Append(HttpUtility.HtmlEncode(Environment.MachineName)).Append(" at ").Append(DateTime.UtcNow).AppendLine(); @@ -520,8 +511,7 @@ public static IHtmlString Render(this MiniProfiler profiler) for (int i = children.Count - 1; i >= 0; i--) timings.Push(children[i]); } } - return new HtmlString(text.ToString()); + return MvcHtmlString.Create(text.ToString()); } - } } \ No newline at end of file diff --git a/StackExchange.Profiling35/Properties/AssemblyInfo.cs b/StackExchange.Profiling35/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..6321b28 --- /dev/null +++ b/StackExchange.Profiling35/Properties/AssemblyInfo.cs @@ -0,0 +1,19 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("StackExchange.Profiling")] +[assembly: AssemblyDescription("A simple but effective mini-profiler for ASP.NET MVC - http://miniprofiler.com")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Stack Exchange")] +[assembly: AssemblyProduct("StackExchange.Profiling")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] +[assembly: Guid("f41f8a8f-55ef-44ac-beaf-d6fa475939a7")] + +[assembly: AssemblyVersion("2.0.4.0")] +[assembly: AssemblyFileVersion("2.0.4.0")] + +[assembly: InternalsVisibleTo("StackExchange.Profiling.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001001172d8b313c5125b3503ab4656bc2c04305498b2c75560f2e4fdc70e22fd098b9fdce619c318b5fb92670406d2122c9912ee718cb24544f69b7a92a825bd6e439bf1b51cf8e32be536954881c067a81e3da26ca348f7a17de7dfc07ae6df14ce132a7cfcb6d5f53f939bc9f623ec0e5ff9edab439c04a9b8bf8c110ebe8908be")] diff --git a/StackExchange.Profiling/SqlFormatters/ISqlFormatter.cs b/StackExchange.Profiling35/SqlFormatters/ISqlFormatter.cs similarity index 100% rename from StackExchange.Profiling/SqlFormatters/ISqlFormatter.cs rename to StackExchange.Profiling35/SqlFormatters/ISqlFormatter.cs diff --git a/StackExchange.Profiling/SqlFormatters/InlineFormatter.cs b/StackExchange.Profiling35/SqlFormatters/InlineFormatter.cs similarity index 100% rename from StackExchange.Profiling/SqlFormatters/InlineFormatter.cs rename to StackExchange.Profiling35/SqlFormatters/InlineFormatter.cs diff --git a/StackExchange.Profiling/SqlFormatters/OracleFormatter.cs b/StackExchange.Profiling35/SqlFormatters/OracleFormatter.cs similarity index 94% rename from StackExchange.Profiling/SqlFormatters/OracleFormatter.cs rename to StackExchange.Profiling35/SqlFormatters/OracleFormatter.cs index 37716be..5a015f2 100644 --- a/StackExchange.Profiling/SqlFormatters/OracleFormatter.cs +++ b/StackExchange.Profiling35/SqlFormatters/OracleFormatter.cs @@ -10,13 +10,14 @@ namespace StackExchange.Profiling.SqlFormatters /// Oracle formatter for all your Oracle formatting needs /// public class OracleFormatter : ISqlFormatter - { + { static readonly Dictionary> paramTranslator; static Func GetWithLenFormatter(string native) { var capture = native; - return p => { + return p => + { if (p.Size < 1) { return capture; } else { return capture + "(" + (p.Size > 8000 ? "max" : p.Size.ToString()) + ")"; } }; } @@ -43,7 +44,7 @@ static OracleFormatter() {DbType.Single, p => "single"}, }; - } + } /// /// Does NOTHING, implement me! /// @@ -74,7 +75,12 @@ public string FormatSql(SqlTiming timing) DbType parsed; string resolvedType = null; - if (!Enum.TryParse(p.DbType, out parsed)) + + try + { + parsed = (DbType)Enum.Parse(typeof(DbType), p.DbType); + } + catch (Exception) { resolvedType = p.DbType; } @@ -100,7 +106,7 @@ public string FormatSql(SqlTiming timing) .Append(timing.CommandString) .ToString(); } - + static readonly string[] dontQuote = new string[] { "Int16", "Int32", "Int64", "Boolean" }; private string PrepareValue(SqlTimingParameter p) { @@ -115,7 +121,7 @@ private string PrepareValue(SqlTimingParameter p) } return "'" + p.Value.Replace("'", "''") + "'"; - } - } - } + } + } +} diff --git a/StackExchange.Profiling/SqlFormatters/SqlServerFormatter.cs b/StackExchange.Profiling35/SqlFormatters/SqlServerFormatter.cs similarity index 95% rename from StackExchange.Profiling/SqlFormatters/SqlServerFormatter.cs rename to StackExchange.Profiling35/SqlFormatters/SqlServerFormatter.cs index 1e18f29..a6a4f30 100644 --- a/StackExchange.Profiling/SqlFormatters/SqlServerFormatter.cs +++ b/StackExchange.Profiling35/SqlFormatters/SqlServerFormatter.cs @@ -68,9 +68,14 @@ public string FormatSql(SqlTiming timing) buffer.AppendLine(",").Append(new string(' ', 8)); } - DbType parsed; + DbType parsed = DbType.String; string resolvedType = null; - if (!Enum.TryParse(p.DbType, out parsed)) + + try + { + parsed = (DbType)Enum.Parse(typeof(DbType), p.DbType); + } + catch (Exception) { resolvedType = p.DbType; } diff --git a/StackExchange.Profiling/SqlProfiler.cs b/StackExchange.Profiling35/SqlProfiler.cs similarity index 99% rename from StackExchange.Profiling/SqlProfiler.cs rename to StackExchange.Profiling35/SqlProfiler.cs index 4735164..937a6c7 100644 --- a/StackExchange.Profiling/SqlProfiler.cs +++ b/StackExchange.Profiling35/SqlProfiler.cs @@ -5,6 +5,7 @@ using StackExchange.Profiling.Data; using System.Linq; using System.Collections.Concurrent; +using StackExchange.Profiling.Helpers; namespace StackExchange.Profiling { diff --git a/StackExchange.Profiling/SqlTiming.cs b/StackExchange.Profiling35/SqlTiming.cs similarity index 98% rename from StackExchange.Profiling/SqlTiming.cs rename to StackExchange.Profiling35/SqlTiming.cs index 0d29d0c..3c88439 100644 --- a/StackExchange.Profiling/SqlTiming.cs +++ b/StackExchange.Profiling35/SqlTiming.cs @@ -1,7 +1,7 @@ - using System; +using System; using System.Collections.Generic; - using System.Data; - using System.Data.Common; +using System.Data; +using System.Data.Common; using StackExchange.Profiling.Data; using System.Text.RegularExpressions; using System.Runtime.Serialization; @@ -214,7 +214,7 @@ private List GetCommandParameters(IDbCommand command) foreach (DbParameter dbParameter in command.Parameters) { - if (!string.IsNullOrWhiteSpace(dbParameter.ParameterName)) + if (dbParameter.ParameterName.HasValue()) { result.Add(new SqlTimingParameter { diff --git a/StackExchange.Profiling/SqlTimingParameter.cs b/StackExchange.Profiling35/SqlTimingParameter.cs similarity index 100% rename from StackExchange.Profiling/SqlTimingParameter.cs rename to StackExchange.Profiling35/SqlTimingParameter.cs diff --git a/StackExchange.Profiling35/StackExchange.Profiling35.csproj b/StackExchange.Profiling35/StackExchange.Profiling35.csproj new file mode 100644 index 0000000..f3ce428 --- /dev/null +++ b/StackExchange.Profiling35/StackExchange.Profiling35.csproj @@ -0,0 +1,146 @@ + + + + + Debug + AnyCPU + {AB77F5B3-615E-446B-9905-833FDEF734A0} + Library + Properties + StackExchange.Profiling35 + StackExchange.Profiling35 + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + + + miniprofiler.snk + + + + + + + + + ..\packages\TaskParallelLibrary.1.0.2856.0\lib\Net35\System.Threading.dll + + + + + + + + + + + + + + IProfilerProvider.cs + + + + + + + + + IUserProvider.cs + + + + + + + + + + + + + SqlTiming.cs + + + + + + + + + + + MiniProfiler.cs + + + MiniProfiler.cs + + + + + WebRequestProfilerProvider.cs + + + + Designer + + + + + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/StackExchange.Profiling/Storage/DatabaseStorageBase.cs b/StackExchange.Profiling35/Storage/DatabaseStorageBase.cs similarity index 100% rename from StackExchange.Profiling/Storage/DatabaseStorageBase.cs rename to StackExchange.Profiling35/Storage/DatabaseStorageBase.cs diff --git a/StackExchange.Profiling/Storage/HttpRuntimeCacheStorage.cs b/StackExchange.Profiling35/Storage/HttpRuntimeCacheStorage.cs similarity index 100% rename from StackExchange.Profiling/Storage/HttpRuntimeCacheStorage.cs rename to StackExchange.Profiling35/Storage/HttpRuntimeCacheStorage.cs diff --git a/StackExchange.Profiling/Storage/IStorage.cs b/StackExchange.Profiling35/Storage/IStorage.cs similarity index 100% rename from StackExchange.Profiling/Storage/IStorage.cs rename to StackExchange.Profiling35/Storage/IStorage.cs diff --git a/StackExchange.Profiling/Timing.cs b/StackExchange.Profiling35/Timing.cs similarity index 100% rename from StackExchange.Profiling/Timing.cs rename to StackExchange.Profiling35/Timing.cs index 4cb7858..8c2762c 100644 --- a/StackExchange.Profiling/Timing.cs +++ b/StackExchange.Profiling35/Timing.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Web; +using StackExchange.Profiling.Data; using System.Runtime.Serialization; using System.Web.Script.Serialization; -using StackExchange.Profiling.Data; namespace StackExchange.Profiling { diff --git a/StackExchange.Profiling/UI/MiniProfilerHandler.cs b/StackExchange.Profiling35/UI/MiniProfilerHandler.cs similarity index 89% rename from StackExchange.Profiling/UI/MiniProfilerHandler.cs rename to StackExchange.Profiling35/UI/MiniProfilerHandler.cs index 00e4169..14ba9e1 100644 --- a/StackExchange.Profiling/UI/MiniProfilerHandler.cs +++ b/StackExchange.Profiling35/UI/MiniProfilerHandler.cs @@ -8,6 +8,7 @@ using StackExchange.Profiling.Helpers; using System.Text; using System.Collections.Concurrent; +using System.Web.Mvc; namespace StackExchange.Profiling.UI { @@ -16,7 +17,7 @@ namespace StackExchange.Profiling.UI /// public class MiniProfilerHandler : IRouteHandler, IHttpHandler { - internal static HtmlString RenderIncludes(MiniProfiler profiler, RenderPosition? position = null, bool? showTrivial = null, bool? showTimeWithChildren = null, int? maxTracesToShow = null, bool? showControls = null, bool? useExistingjQuery = null) + internal static MvcHtmlString RenderIncludes(MiniProfiler profiler, RenderPosition? position = null, bool? showTrivial = null, bool? showTimeWithChildren = null, int? maxTracesToShow = null, bool? showControls = null, bool? useExistingjQuery = null) { string format = GetResource("include.partial.html"); @@ -27,9 +28,9 @@ internal static HtmlString RenderIncludes(MiniProfiler profiler, RenderPosition? // HACK: unviewed ids are added to this list during Storage.Save, but we know we haven't see the current one yet, // so go ahead and add it to the end - it's usually the only id, but if there was a redirect somewhere, it'll be there, too MiniProfiler.Settings.EnsureStorageStrategy(); - - var authorized = - MiniProfiler.Settings.Results_Authorize == null || + + var authorized = + MiniProfiler.Settings.Results_Authorize == null || MiniProfiler.Settings.Results_Authorize(HttpContext.Current.Request); List ids; @@ -57,10 +58,10 @@ internal static HtmlString RenderIncludes(MiniProfiler profiler, RenderPosition? authorized = authorized ? "true" : "false", useExistingjQuery = useExistingjQuery ?? MiniProfiler.Settings.UseExistingjQuery ? "true" : "false" }); - + } - return new HtmlString(result); + return MvcHtmlString.Create(result); } /// @@ -68,7 +69,7 @@ internal static HtmlString RenderIncludes(MiniProfiler profiler, RenderPosition? /// public static void RegisterRoutes() { - + var routes = RouteTable.Routes; var handler = new MiniProfilerHandler(); var prefix = MiniProfiler.Settings.RouteBasePath.Replace("~/", "").EnsureTrailingSlash(); @@ -78,12 +79,12 @@ public static void RegisterRoutes() var route = new Route(prefix + "{filename}", handler) { // we have to specify these, so no MVC route helpers will match, e.g. @Html.ActionLink("Home", "Index", "Home") - Defaults = new RouteValueDictionary( new { controller = "MiniProfilerHandler", action = "ProcessRequest" }), - Constraints = new RouteValueDictionary( new { controller = "MiniProfilerHandler", action = "ProcessRequest" }) + Defaults = new RouteValueDictionary(new { controller = "MiniProfilerHandler", action = "ProcessRequest" }), + Constraints = new RouteValueDictionary(new { controller = "MiniProfilerHandler", action = "ProcessRequest" }) }; // put our routes at the beginning, like a boss - routes.Insert(0, route); + routes.Insert(0, route); } } @@ -123,7 +124,7 @@ public void ProcessRequest(HttpContext context) case "results-index": output = Index(context); break; - + case "results-list": output = ResultList(context); break; @@ -151,12 +152,20 @@ private static string ResultList(HttpContext context) var lastId = context.Request["last-id"]; Guid lastGuid = Guid.Empty; - if (!lastId.IsNullOrWhiteSpace()) { - Guid.TryParse(lastId, out lastGuid); + if (!lastId.IsNullOrWhiteSpace()) + { + try + { + lastGuid = new Guid(lastId); + } + catch (Exception) + { + // noop. + } } //After app restart, MiniProfiler.Settings.Storage will be null if no results saved, and NullReferenceException is thrown. - if(MiniProfiler.Settings.Storage == null) { MiniProfiler.Settings.EnsureStorageStrategy(); } + if (MiniProfiler.Settings.Storage == null) { MiniProfiler.Settings.EnsureStorageStrategy(); } var guids = MiniProfiler.Settings.Storage.List(100); if (lastGuid != Guid.Empty) @@ -166,13 +175,13 @@ private static string ResultList(HttpContext context) guids = guids.Reverse(); - return guids.Select(g => + return guids.Select(g => { var profiler = MiniProfiler.Settings.Storage.Load(g); - return new + return new { - profiler.Id, - profiler.Name, + profiler.Id, + profiler.Name, profiler.DurationMilliseconds, profiler.DurationMillisecondsInSql, profiler.ClientTimings, @@ -189,7 +198,7 @@ private static string ResultList(HttpContext context) profiler.User }; } - + ).ToJson(); } @@ -203,7 +212,7 @@ private static string Index(HttpContext context) context.Response.ContentType = "text/html"; - var path = VirtualPathUtility.ToAbsolute(MiniProfiler.Settings.RouteBasePath).EnsureTrailingSlash(); + var path = VirtualPathUtility.ToAbsolute(MiniProfiler.Settings.RouteBasePath).EnsureTrailingSlash(); return new StringBuilder() .AppendLine("") @@ -213,7 +222,7 @@ private static string Index(HttpContext context) .AppendLine("") .AppendLine("") .AppendLine("") - .AppendLine("") + .AppendLine("") .AppendLine("") .AppendLine("") .ToString(); @@ -247,7 +256,7 @@ private static string Includes(HttpContext context, string path) cache.SetExpires(DateTime.Now.AddDays(7)); cache.SetValidUntilExpires(true); #endif - + var embeddedFile = Path.GetFileName(path); return GetResource(embeddedFile); @@ -260,14 +269,21 @@ private static string Results(HttpContext context) { // when we're rendering as a button/popup in the corner, we'll pass ?popup=1 // if it's absent, we're rendering results as a full page for sharing - var isPopup = !string.IsNullOrWhiteSpace(context.Request["popup"]); + var isPopup = context.Request["popup"].HasValue(); // this guid is the MiniProfiler.Id property // if this guid is not supplied, the last set of results needs to be // displayed. The home page doesn't have profiling otherwise. Guid id; - if (!Guid.TryParse(context.Request["id"], out id)) + + try + { + id = new Guid(context.Request["id"]); + } + catch (Exception) + { id = MiniProfiler.Settings.Storage.List(1).FirstOrDefault(); + } if (id == default(Guid)) return isPopup ? NotFound(context) : NotFound(context, "text/plain", "No Guid id specified on the query string"); @@ -299,7 +315,7 @@ private static string Results(HttpContext context) } } - if (profiler.HasUserViewed == false) + if (profiler.HasUserViewed == false) { profiler.HasUserViewed = true; needsSave = true; @@ -347,7 +363,7 @@ private static string ResultsFullPage(HttpContext context, MiniProfiler profiler context.Response.ContentType = "text/html"; var template = GetResource("share.html"); - return template.Format(new + return template.Format(new { name = profiler.Name, duration = profiler.DurationMilliseconds.ToString(), @@ -358,13 +374,13 @@ private static string ResultsFullPage(HttpContext context, MiniProfiler profiler }); } - private static bool bypassLocalLoad = false; + private static bool bypassLocalLoad = false; private static string GetResource(string filename) { filename = filename.ToLower(); string result; -#if DEBUG +#if DEBUG // attempt to simply load from file system, this lets up modify js without needing to recompile A MILLION TIMES if (!bypassLocalLoad) { @@ -375,12 +391,12 @@ private static string GetResource(string filename) { return File.ReadAllText(path); } - catch + catch { bypassLocalLoad = true; } } - + #endif if (!_ResourceCache.TryGetValue(filename, out result)) diff --git a/StackExchange.Profiling35/UI/include.partial.html b/StackExchange.Profiling35/UI/include.partial.html new file mode 100644 index 0000000..7c4c2e0 --- /dev/null +++ b/StackExchange.Profiling35/UI/include.partial.html @@ -0,0 +1 @@ + diff --git a/StackExchange.Profiling35/UI/includes.css b/StackExchange.Profiling35/UI/includes.css new file mode 100644 index 0000000..93c74ea --- /dev/null +++ b/StackExchange.Profiling35/UI/includes.css @@ -0,0 +1 @@ +.profiler-result,.profiler-queries{color:#555;line-height:1;font-size:12px;}.profiler-result pre,.profiler-queries pre,.profiler-result code,.profiler-queries code,.profiler-result label,.profiler-queries label,.profiler-result table,.profiler-queries table,.profiler-result tbody,.profiler-queries tbody,.profiler-result thead,.profiler-queries thead,.profiler-result tfoot,.profiler-queries tfoot,.profiler-result tr,.profiler-queries tr,.profiler-result th,.profiler-queries th,.profiler-result td,.profiler-queries td{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline;background-color:transparent;overflow:visible;max-height:none;}.profiler-result table,.profiler-queries table{border-collapse:collapse;border-spacing:0;}.profiler-result a,.profiler-queries a,.profiler-result a:hover,.profiler-queries a:hover{cursor:pointer;color:#07c;}.profiler-result a,.profiler-queries a{text-decoration:none;}.profiler-result a:hover,.profiler-queries a:hover{text-decoration:underline;}.profiler-result{font-family:Helvetica,Arial,sans-serif;}.profiler-result .profiler-toggle-duration-with-children{float:right;}.profiler-result table.profiler-client-timings{margin-top:10px;}.profiler-result .profiler-label{color:#555;overflow:hidden;text-overflow:ellipsis;}.profiler-result .profiler-unit{color:#aaa;}.profiler-result .profiler-trivial{display:none;}.profiler-result .profiler-trivial td,.profiler-result .profiler-trivial td *{color:#aaa !important;}.profiler-result pre,.profiler-result code,.profiler-result .profiler-number,.profiler-result .profiler-unit{font-family:Consolas,monospace,serif;}.profiler-result .profiler-number{color:#111;}.profiler-result .profiler-info{text-align:right;}.profiler-result .profiler-info .profiler-name{float:left;}.profiler-result .profiler-info .profiler-server-time{white-space:nowrap;}.profiler-result .profiler-timings th{background-color:#fff;color:#aaa;text-align:right;}.profiler-result .profiler-timings th,.profiler-result .profiler-timings td{white-space:nowrap;}.profiler-result .profiler-timings .profiler-duration-with-children{display:none;}.profiler-result .profiler-timings .profiler-duration{font-family:Consolas,monospace,serif;color:#111;text-align:right;}.profiler-result .profiler-timings .profiler-indent{letter-spacing:4px;}.profiler-result .profiler-timings .profiler-queries-show .profiler-number,.profiler-result .profiler-timings .profiler-queries-show .profiler-unit{color:#07c;}.profiler-result .profiler-timings .profiler-queries-duration{padding-left:6px;}.profiler-result .profiler-timings .profiler-percent-in-sql{white-space:nowrap;text-align:right;}.profiler-result .profiler-timings tfoot td{padding-top:10px;text-align:right;}.profiler-result .profiler-timings tfoot td a{font-size:95%;display:inline-block;margin-left:12px;}.profiler-result .profiler-timings tfoot td a:first-child{float:left;margin-left:0px;}.profiler-result .profiler-queries{font-family:Helvetica,Arial,sans-serif;}.profiler-result .profiler-queries .profiler-stack-trace{margin-bottom:15px;}.profiler-result .profiler-queries pre{font-family:Consolas,monospace,serif;white-space:pre-wrap;}.profiler-result .profiler-queries th{background-color:#fff;border-bottom:1px solid #555;font-weight:bold;padding:15px;white-space:nowrap;}.profiler-result .profiler-queries td{padding:15px;text-align:left;background-color:#fff;}.profiler-result .profiler-queries td:last-child{padding-right:25px;}.profiler-result .profiler-queries .profiler-odd td{background-color:#e5e5e5;}.profiler-result .profiler-queries .profiler-since-start,.profiler-result .profiler-queries .profiler-duration{text-align:right;}.profiler-result .profiler-queries .profiler-info div{text-align:right;margin-bottom:5px;}.profiler-result .profiler-queries .profiler-gap-info,.profiler-result .profiler-queries .profiler-gap-info td{background-color:#ccc;}.profiler-result .profiler-queries .profiler-gap-info .profiler-unit{color:#777;}.profiler-result .profiler-queries .profiler-gap-info .profiler-info{text-align:right;}.profiler-result .profiler-queries .profiler-gap-info.profiler-trivial-gaps{display:none;}.profiler-result .profiler-queries .profiler-trivial-gap-container{text-align:center;}.profiler-result .profiler-queries .str{color:maroon;}.profiler-result .profiler-queries .kwd{color:#00008b;}.profiler-result .profiler-queries .com{color:gray;}.profiler-result .profiler-queries .typ{color:#2b91af;}.profiler-result .profiler-queries .lit{color:maroon;}.profiler-result .profiler-queries .pun{color:#000;}.profiler-result .profiler-queries .pln{color:#000;}.profiler-result .profiler-queries .tag{color:maroon;}.profiler-result .profiler-queries .atn{color:red;}.profiler-result .profiler-queries .atv{color:blue;}.profiler-result .profiler-queries .dec{color:purple;}.profiler-result .profiler-warning,.profiler-result .profiler-warning *,.profiler-result .profiler-warning .profiler-queries-show,.profiler-result .profiler-warning .profiler-queries-show .profiler-unit{color:#f00;}.profiler-result .profiler-warning:hover,.profiler-result .profiler-warning *:hover,.profiler-result .profiler-warning .profiler-queries-show:hover,.profiler-result .profiler-warning .profiler-queries-show .profiler-unit:hover{color:#f00;}.profiler-result .profiler-nuclear{color:#f00;font-weight:bold;padding-right:2px;}.profiler-result .profiler-nuclear:hover{color:#f00;}.profiler-results{z-index:2147483643;position:fixed;top:0px;}.profiler-results.profiler-left{left:0px;}.profiler-results.profiler-left.profiler-no-controls .profiler-result:last-child .profiler-button,.profiler-results.profiler-left .profiler-controls{-webkit-border-bottom-right-radius:10px;-moz-border-radius-bottomright:10px;border-bottom-right-radius:10px;}.profiler-results.profiler-left .profiler-button,.profiler-results.profiler-left .profiler-controls{border-right:1px solid #888;}.profiler-results.profiler-right{right:0px;}.profiler-results.profiler-right.profiler-no-controls .profiler-result:last-child .profiler-button,.profiler-results.profiler-right .profiler-controls{-webkit-border-bottom-left-radius:10px;-moz-border-radius-bottomleft:10px;border-bottom-left-radius:10px;}.profiler-results.profiler-right .profiler-button,.profiler-results.profiler-right .profiler-controls{border-left:1px solid #888;}.profiler-results .profiler-button,.profiler-results .profiler-controls{display:none;z-index:2147483640;border-bottom:1px solid #888;background-color:#fff;padding:4px 7px;text-align:right;cursor:pointer;}.profiler-results .profiler-button.profiler-button-active,.profiler-results .profiler-controls.profiler-button-active{background-color:maroon;}.profiler-results .profiler-button.profiler-button-active .profiler-number,.profiler-results .profiler-controls.profiler-button-active .profiler-number,.profiler-results .profiler-button.profiler-button-active .profiler-nuclear,.profiler-results .profiler-controls.profiler-button-active .profiler-nuclear{color:#fff;font-weight:bold;}.profiler-results .profiler-button.profiler-button-active .profiler-unit,.profiler-results .profiler-controls.profiler-button-active .profiler-unit{color:#fff;font-weight:normal;}.profiler-results .profiler-controls{display:block;font-size:12px;font-family:Consolas,monospace,serif;cursor:default;text-align:center;}.profiler-results .profiler-controls span{border-right:1px solid #aaa;padding-right:5px;margin-right:5px;cursor:pointer;}.profiler-results .profiler-controls span:last-child{border-right:none;}.profiler-results .profiler-popup{display:none;z-index:2147483641;position:absolute;background-color:#fff;border:1px solid #aaa;padding:5px 10px;text-align:left;line-height:18px;overflow:auto;-moz-box-shadow:0px 1px 15px #555;-webkit-box-shadow:0px 1px 15px #555;box-shadow:0px 1px 15px #555;}.profiler-results .profiler-popup .profiler-info{margin-bottom:3px;padding-bottom:2px;border-bottom:1px solid #ddd;}.profiler-results .profiler-popup .profiler-info .profiler-name{font-size:110%;font-weight:bold;}.profiler-results .profiler-popup .profiler-info .profiler-name .profiler-overall-duration{display:none;}.profiler-results .profiler-popup .profiler-info .profiler-server-time{font-size:95%;}.profiler-results .profiler-popup .profiler-timings th,.profiler-results .profiler-popup .profiler-timings td{padding-left:6px;padding-right:6px;}.profiler-results .profiler-popup .profiler-timings th{font-size:95%;padding-bottom:3px;}.profiler-results .profiler-popup .profiler-timings .profiler-label{max-width:275px;}.profiler-results .profiler-queries{display:none;z-index:2147483643;position:absolute;overflow-y:auto;overflow-x:auto;background-color:#fff;}.profiler-results .profiler-queries th{font-size:17px;}.profiler-results.profiler-min .profiler-result{display:none;}.profiler-results.profiler-min .profiler-controls span{display:none;}.profiler-results.profiler-min .profiler-controls .profiler-min-max{border-right:none;padding:0px;margin:0px;}.profiler-queries-bg{z-index:2147483642;display:none;background:#000;opacity:0.7;position:absolute;top:0px;left:0px;min-width:100%;}.profiler-result-full .profiler-result{width:950px;margin:30px auto;}.profiler-result-full .profiler-result .profiler-button{display:none;}.profiler-result-full .profiler-result .profiler-popup .profiler-info{font-size:25px;border-bottom:1px solid #aaa;padding-bottom:3px;margin-bottom:25px;}.profiler-result-full .profiler-result .profiler-popup .profiler-info .profiler-overall-duration{padding-right:20px;font-size:80%;color:#888;}.profiler-result-full .profiler-result .profiler-popup .profiler-timings td,.profiler-result-full .profiler-result .profiler-popup .profiler-timings th{padding-left:8px;padding-right:8px;}.profiler-result-full .profiler-result .profiler-popup .profiler-timings th{padding-bottom:7px;}.profiler-result-full .profiler-result .profiler-popup .profiler-timings td{font-size:14px;padding-bottom:4px;}.profiler-result-full .profiler-result .profiler-popup .profiler-timings td:first-child{padding-left:10px;}.profiler-result-full .profiler-result .profiler-popup .profiler-timings .profiler-label{max-width:550px;}.profiler-result-full .profiler-result .profiler-queries{margin:25px 0;}.profiler-result-full .profiler-result .profiler-queries table{width:100%;}.profiler-result-full .profiler-result .profiler-queries th{font-size:16px;color:#555;line-height:20px;}.profiler-result-full .profiler-result .profiler-queries td{padding:15px 10px;text-align:left;}.profiler-result-full .profiler-result .profiler-queries .profiler-info div{text-align:right;margin-bottom:5px;} \ No newline at end of file diff --git a/StackExchange.Profiling35/UI/includes.js b/StackExchange.Profiling35/UI/includes.js new file mode 100644 index 0000000..4424357 --- /dev/null +++ b/StackExchange.Profiling35/UI/includes.js @@ -0,0 +1,897 @@ +"use strict"; +var MiniProfiler = (function () { + var $; + + var options, + container, + controls, + fetchedIds = [], + fetchingIds = [], // so we never pull down a profiler twice + ajaxStartTime + ; + + var hasLocalStorage = function () { + try { + return 'localStorage' in window && window['localStorage'] !== null; + } catch (e) { + return false; + } + }; + + var getVersionedKey = function (keyPrefix) { + return keyPrefix + '-' + options.version; + } + + var save = function (keyPrefix, value) { + if (!hasLocalStorage()) { return; } + + // clear old keys with this prefix, if any + for (var i = 0; i < localStorage.length; i++) { + if ((localStorage.key(i) || '').indexOf(keyPrefix) > -1) { + localStorage.removeItem(localStorage.key(i)); + } + } + + // save under this version + localStorage[getVersionedKey(keyPrefix)] = value; + }; + + var load = function (keyPrefix) { + if (!hasLocalStorage()) { return null; } + + return localStorage[getVersionedKey(keyPrefix)]; + }; + + var fetchTemplates = function (success) { + var key = 'templates', + cached = load(key); + + if (cached) { + $('body').append(cached); + success(); + } + else { + $.get(options.path + 'includes.tmpl?v=' + options.version, function (data) { + if (data) { + save(key, data); + $('body').append(data); + success(); + } + }); + } + }; + + var getClientPerformance = function () { + return window.performance == null ? null : window.performance; + } + + var waitedForEnd = 0; + var fetchResults = function (ids) { + var clientPerformance, clientProbes, i, j, p, id, idx; + + for (i = 0; i < ids.length; i++) { + id = ids[i]; + + clientPerformance = null; + clientProbes = null; + + if (window.mPt) { + clientProbes = mPt.results(); + for (j = 0; j < clientProbes.length; j++) { + clientProbes[j].d = clientProbes[j].d.getTime(); + } + mPt.flush(); + } + + if (id == options.currentId) { + + clientPerformance = getClientPerformance(); + + if (clientPerformance != null) { + // ie is buggy strip out functions + var copy = { navigation: {}, timing: {} }; + + var timing = $.extend({}, clientPerformance.timing); + + for (p in timing) { + if (timing.hasOwnProperty(p) && !$.isFunction(timing[p])) { + copy.timing[p] = timing[p]; + } + } + if (clientPerformance.navigation) { + copy.navigation.redirectCount = clientPerformance.navigation.redirectCount; + } + clientPerformance = copy; + + // hack to add chrome timings + if (window.chrome && window.chrome.loadTimes) { + var chromeTimes = window.chrome.loadTimes(); + if (chromeTimes.firstPaintTime) { + clientPerformance.timing["First Paint Time"] = Math.round(chromeTimes.firstPaintTime * 1000); + } + if (chromeTimes.firstPaintTime) { + clientPerformance.timing["First Paint After Load Time"] = Math.round(chromeTimes.firstPaintAfterLoadTime * 1000); + } + + } + } + } else if (ajaxStartTime != null && clientProbes && clientProbes.length > 0) { + clientPerformance = { timing: { navigationStart: ajaxStartTime.getTime() } }; + ajaxStartTime = null; + } + + if ($.inArray(id, fetchedIds) < 0 && $.inArray(id, fetchingIds) < 0) { + idx = fetchingIds.push(id) - 1; + + $.ajax({ + url: options.path + 'results', + data: { id: id, clientPerformance: clientPerformance, clientProbes: clientProbes, popup: 1 }, + dataType: 'json', + type: 'POST', + success: function (json) { + fetchedIds.push(id); + if (json != "hidden") { + buttonShow(json); + } + }, + complete: function () { + fetchingIds.splice(idx, 1); + } + }); + } + } + }; + + var renderTemplate = function (json) { + return $('#profilerTemplate').tmpl(json); + }; + + var buttonShow = function (json) { + var result = renderTemplate(json); + + if (controls) + result.insertBefore(controls); + else + result.appendTo(container); + + var button = result.find('.profiler-button'), + popup = result.find('.profiler-popup'); + + // button will appear in corner with the total profiling duration - click to show details + button.click(function () { buttonClick(button, popup); }); + + // small duration steps and the column with aggregate durations are hidden by default; allow toggling + toggleHidden(popup); + + // lightbox in the queries + popup.find('.profiler-queries-show').click(function () { queriesShow($(this), result); }); + + // limit count + if (container.find('.profiler-result').length > options.maxTracesToShow) + container.find('.profiler-result').first().remove(); + button.show(); + }; + + var toggleHidden = function (popup) { + var trivial = popup.find('.profiler-toggle-trivial'); + var childrenTime = popup.find('.profiler-toggle-duration-with-children'); + var trivialGaps = popup.parent().find('.profiler-toggle-trivial-gaps'); + + var toggleIt = function (node) { + var link = $(node), + klass = "profiler-" + link.attr('class').substr('profiler-toggle-'.length), + isHidden = link.text().indexOf('show') > -1; + + popup.parent().find('.' + klass).toggle(isHidden); + link.text(link.text().replace(isHidden ? 'show' : 'hide', isHidden ? 'hide' : 'show')); + + popupPreventHorizontalScroll(popup); + }; + + childrenTime.add(trivial).add(trivialGaps).click(function () { + toggleIt(this); + }); + + // if option is set or all our timings are trivial, go ahead and show them + if (options.showTrivial || trivial.data('show-on-load')) { + toggleIt(trivial); + } + // if option is set, go ahead and show time with children + if (options.showChildrenTime) { + toggleIt(childrenTime); + } + }; + + var buttonClick = function (button, popup) { + // we're toggling this button/popup + if (popup.is(':visible')) { + popupHide(button, popup); + } + else { + var visiblePopups = container.find('.profiler-popup:visible'), + theirButtons = visiblePopups.siblings('.profiler-button'); + + // hide any other popups + popupHide(theirButtons, visiblePopups); + + // before showing the one we clicked + popupShow(button, popup); + } + }; + + var popupShow = function (button, popup) { + button.addClass('profiler-button-active'); + + popupSetDimensions(button, popup); + + popup.show(); + + popupPreventHorizontalScroll(popup); + }; + + var popupSetDimensions = function (button, popup) { + var top = button.position().top - 1, // position next to the button we clicked + windowHeight = $(window).height(), + maxHeight = windowHeight - top - 40; // make sure the popup doesn't extend below the fold + + popup + .css({ 'top': top, 'max-height': maxHeight }) + .css(options.renderPosition, button.outerWidth() - 3); // move left or right, based on config + }; + + var popupPreventHorizontalScroll = function (popup) { + var childrenHeight = 0; + + popup.children().each(function () { childrenHeight += $(this).height(); }); + + popup.css({ 'padding-right': childrenHeight > popup.height() ? 40 : 10 }); + } + + var popupHide = function (button, popup) { + button.removeClass('profiler-button-active'); + popup.hide(); + }; + + var queriesShow = function (link, result) { + + var px = 30, + win = $(window), + width = win.width() - 2 * px, + height = win.height() - 2 * px, + queries = result.find('.profiler-queries'); + + // opaque background + $('
').appendTo('body').css({ 'height': $(document).height() }).show(); + + // center the queries and ensure long content is scrolled + queries.css({ 'top': px, 'max-height': height, 'width': width }).css(options.renderPosition, px) + .find('table').css({ 'width': width }); + + // have to show everything before we can get a position for the first query + queries.show(); + + queriesScrollIntoView(link, queries, queries); + + // syntax highlighting + prettyPrint(); + }; + + var queriesScrollIntoView = function (link, queries, whatToScroll) { + var id = link.closest('tr').attr('data-timing-id'), + cells = queries.find('tr[data-timing-id="' + id + '"] td'); + + // ensure they're in view + whatToScroll.scrollTop(whatToScroll.scrollTop() + cells.first().position().top - 100); + + // highlight and then fade back to original bg color; do it ourselves to prevent any conflicts w/ jquery.UI or other implementations of Resig's color plugin + cells.each(function () { + var cell = $(this), + highlightHex = '#FFFFBB', + highlightRgb = getRGB(highlightHex), + originalRgb = getRGB(cell.css('background-color')), + getColorDiff = function (fx, i) { + // adapted from John Resig's color plugin: http://plugins.jquery.com/project/color + return Math.max(Math.min(parseInt((fx.pos * (originalRgb[i] - highlightRgb[i])) + highlightRgb[i]), 255), 0); + }; + + // we need to animate some other property to piggy-back on the step function, so I choose you, opacity! + cell.css({ 'opacity': 1, 'background-color': highlightHex }) + .animate({ 'opacity': 1 }, { duration: 2000, step: function (now, fx) { + fx.elem.style['backgroundColor'] = "rgb(" + [getColorDiff(fx, 0), getColorDiff(fx, 1), getColorDiff(fx, 2)].join(",") + ")"; + } + }); + }); + }; + + // Color Conversion functions from highlightFade + // By Blair Mitchelmore + // http://jquery.offput.ca/highlightFade/ + // Parse strings looking for color tuples [255,255,255] + var getRGB = function (color) { + var result; + + // Check if we're already dealing with an array of colors + if (color && color.constructor == Array && color.length == 3) return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) return [parseFloat(result[1]) * 2.55, parseFloat(result[2]) * 2.55, parseFloat(result[3]) * 2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) return [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) return [parseInt(result[1] + result[1], 16), parseInt(result[2] + result[2], 16), parseInt(result[3] + result[3], 16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) return colors['transparent']; + + return null; + }; + + var bindDocumentEvents = function () { + $(document).bind('click keyup', function (e) { + + // this happens on every keystroke, and :visible is crazy expensive in IE <9 + // and in this case, the display:none check is sufficient. + var popup = $('.profiler-popup').filter(function () { return $(this).css("display") !== "none"; }); + + if (!popup.length) { + return; + } + + var button = popup.siblings('.profiler-button'), + queries = popup.closest('.profiler-result').find('.profiler-queries'), + bg = $('.profiler-queries-bg'), + isEscPress = e.type == 'keyup' && e.which == 27, + hidePopup = false, + hideQueries = false; + + if (bg.is(':visible')) { + hideQueries = isEscPress || (e.type == 'click' && !$.contains(queries[0], e.target) && !$.contains(popup[0], e.target)); + } + else if (popup.is(':visible')) { + hidePopup = isEscPress || (e.type == 'click' && !$.contains(popup[0], e.target) && !$.contains(button[0], e.target) && button[0] != e.target); + } + + if (hideQueries) { + bg.remove(); + queries.hide(); + } + + if (hidePopup) { + popupHide(button, popup); + } + }); + }; + + var initFullView = function () { + + // first, get jquery tmpl, then render and bind handlers + fetchTemplates(function () { + + // profiler will be defined in the full page's head + renderTemplate(profiler).appendTo(container); + + var popup = $('.profiler-popup'); + + toggleHidden(popup); + + prettyPrint(); + + // since queries are already shown, just highlight and scroll when clicking a "1 sql" link + popup.find('.profiler-queries-show').click(function () { + queriesScrollIntoView($(this), $('.profiler-queries'), $(document)); + }); + }); + }; + + var initControls = function (container) { + if (options.showControls) { + controls = $('
mc
').appendTo(container); + + $('.profiler-controls .profiler-min-max').click(function () { + container.toggleClass('profiler-min'); + }); + + container.hover(function () { + if ($(this).hasClass('profiler-min')) { + $(this).find('.profiler-min-max').show(); + } + }, + function () { + if ($(this).hasClass('profiler-min')) { + $(this).find('.profiler-min-max').hide(); + } + }); + + $('.profiler-controls .profiler-clear').click(function () { + container.find('.profiler-result').remove(); + }); + } + else { + container.addClass('profiler-no-controls'); + } + }; + + var initPopupView = function () { + + if (options.authorized) { + // all fetched profilings will go in here + container = $('
').appendTo('body'); + + // MiniProfiler.RenderIncludes() sets which corner to render in - default is upper left + container.addClass("profiler-" + options.renderPosition); + + //initialize the controls + initControls(container); + + // we'll render results json via a jquery.tmpl - after we get the templates, we'll fetch the initial json to populate it + fetchTemplates(function () { + // get master page profiler results + fetchResults(options.ids); + }); + } + else { + fetchResults(options.ids); + } + + var jQueryAjaxComplete = function (e, xhr, settings) { + if (xhr) { + // should be an array of strings, e.g. ["008c4813-9bd7-443d-9376-9441ec4d6a8c","16ff377b-8b9c-4c20-a7b5-97cd9fa7eea7"] + var stringIds = xhr.getResponseHeader('X-MiniProfiler-Ids'); + if (stringIds) { + var ids = typeof JSON != 'undefined' ? JSON.parse(stringIds) : eval(stringIds); + fetchResults(ids); + } + } + }; + + // fetch profile results for any ajax calls + // note, this does not use $ cause we want to hook into the main jQuery + if (jQuery && jQuery(document) && jQuery(document).ajaxComplete) { + jQuery(document).ajaxComplete(jQueryAjaxComplete); + } + + if (jQuery && jQuery(document).ajaxStart) + jQuery(document).ajaxStart(function () { ajaxStartTime = new Date(); }); + + // fetch results after ASP Ajax calls + if (typeof (Sys) != 'undefined' && typeof (Sys.WebForms) != 'undefined' && typeof (Sys.WebForms.PageRequestManager) != 'undefined') { + // Get the instance of PageRequestManager. + var PageRequestManager = Sys.WebForms.PageRequestManager.getInstance(); + + PageRequestManager.add_endRequest(function (sender, args) { + if (args) { + var response = args.get_response(); + if (response.get_responseAvailable() && response._xmlHttpRequest != null) { + var stringIds = args.get_response().getResponseHeader('X-MiniProfiler-Ids'); + if (stringIds) { + var ids = typeof JSON != 'undefined' ? JSON.parse(stringIds) : eval(stringIds); + fetchResults(ids); + } + } + } + }); + } + + // more Asp.Net callbacks + if (typeof (WebForm_ExecuteCallback) == "function") { + WebForm_ExecuteCallback = (function (callbackObject) { + // Store original function + var original = WebForm_ExecuteCallback; + + return function (callbackObject) { + original(callbackObject); + + var stringIds = callbackObject.xmlRequest.getResponseHeader('X-MiniProfiler-Ids'); + if (stringIds) { + var ids = typeof JSON != 'undefined' ? JSON.parse(stringIds) : eval(stringIds); + fetchResults(ids); + } + } + + })(); + } + + // also fetch results after ExtJS requests, in case it is being used + if (typeof (Ext) != 'undefined' && typeof (Ext.Ajax) != 'undefined' && typeof (Ext.Ajax.on) != 'undefined') { + // Ext.Ajax is a singleton, so we just have to attach to its 'requestcomplete' event + Ext.Ajax.on('requestcomplete', function(e, xhr, settings) { + var stringIds = xhr.getResponseHeader('X-MiniProfiler-Ids'); + if (stringIds) { + var ids = typeof JSON != 'undefined' ? JSON.parse(stringIds) : eval(stringIds); + fetchResults(ids); + } + }); + } + + // some elements want to be hidden on certain doc events + bindDocumentEvents(); + }; + + return { + + init: function () { + var script = document.getElementById('mini-profiler'); + if (!script || !script.getAttribute) return; + + options = (function () { + var version = script.getAttribute('data-version'); + var path = script.getAttribute('data-path'); + + var currentId = script.getAttribute('data-current-id'); + + var ids = script.getAttribute('data-ids'); + if (ids) ids = ids.split(','); + + var position = script.getAttribute('data-position'); + + if (script.getAttribute('data-max-traces')) + var maxTraces = parseInt(script.getAttribute('data-max-traces')); + + if (script.getAttribute('data-trivial') === 'true') var trivial = true; + if (script.getAttribute('data-children') == 'true') var children = true; + if (script.getAttribute('data-controls') == 'true') var controls = true; + if (script.getAttribute('data-authorized') == 'true') var authorized = true; + + return { + ids: ids, + path: path, + version: version, + renderPosition: position, + showTrivial: trivial, + showChildrenTime: children, + maxTracesToShow: maxTraces, + showControls: controls, + currentId: currentId, + authorized: authorized + } + })(); + + var doInit = function () { + // when rendering a shared, full page, this div will exist + container = $('.profiler-result-full'); + + if (container.length) { + if (window.location.href.indexOf("&trivial=1") > 0) { + options.showTrivial = true + } + initFullView(); + } + else { + initPopupView(); + } + }; + + // this preserves debugging + var load = function (s, f) { + var sc = document.createElement("script"); + sc.async = "async"; + sc.type = "text/javascript"; + sc.src = s; + var done = false; + sc.onload = sc.onreadystatechange = function (_, abort) { + if (!sc.readyState || /loaded|complete/.test(sc.readyState)) { + if (!abort && !done) { done = true; f(); } + } + }; + document.getElementsByTagName('head')[0].appendChild(sc); + }; + + var wait = 0; + var finish = false; + var deferInit = function() { + if (finish) return; + if (window.performance && window.performance.timing && window.performance.timing.loadEventEnd == 0 && wait < 10000) { + setTimeout(deferInit, 100); + wait += 100; + } else { + finish = true; + init(); + } + }; + + var init = function() { + if (options.authorized) { + var url = options.path + "includes.css?v=" + options.version; + if (document.createStyleSheet) { + document.createStyleSheet(url); + } else { + $('head').append($('')); + } + if (!$.tmpl) { + load(options.path + 'jquery.tmpl.js?v=' + options.version, doInit); + } else { + doInit(); + } + } + else { + doInit(); + } + } + + if (typeof(jQuery) == 'function') { + var jQueryVersion = jQuery.fn.jquery.split('.'); + } + if (jQueryVersion && parseInt(jQueryVersion[0]) < 2 && parseInt(jQueryVersion[1]) >= 7) { + MiniProfiler.jQuery = $ = jQuery; + $(deferInit); + } else { + load(options.path + "jquery.1.7.1.js?v=" + options.version, function() { + MiniProfiler.jQuery = $ = jQuery.noConflict(true); + $(deferInit); + }); + } + }, + + getClientTimingByName: function (clientTiming, name) { + + for (var i = 0; i < clientTiming.Timings.length; i++) { + if (clientTiming.Timings[i].Name == name) { + return clientTiming.Timings[i]; + } + } + return { Name: name, Duration: "", Start: "" }; + }, + + renderDate: function (jsonDate) { // JavaScriptSerializer sends dates as /Date(1308024322065)/ + if (jsonDate) { + return (typeof jsonDate === 'string') ? new Date(parseInt(jsonDate.replace("/Date(", "").replace(")/", ""), 10)).toUTCString() : jsonDate; + } + }, + + renderIndent: function (depth) { + var result = ''; + for (var i = 0; i < depth; i++) { + result += ' '; + } + return result; + }, + + renderExecuteType: function (typeId) { + // see StackExchange.Profiling.ExecuteType enum + switch (typeId) { + case 0: return 'None'; + case 1: return 'NonQuery'; + case 2: return 'Scalar'; + case 3: return 'Reader'; + } + }, + + shareUrl: function (id) { + return options.path + 'results?id=' + id; + }, + + getClientTimings: function (clientTimings) { + var list = []; + var t; + + if (!clientTimings.Timings) return []; + + for (var i = 0; i < clientTimings.Timings.length; i++) { + t = clientTimings.Timings[i]; + var trivial = t.Name != "Dom Complete" && t.Name != "Response" && t.Name != "First Paint Time"; + trivial = t.Duration < 2 ? trivial : false; + list.push( + { + isTrivial: trivial, + name: t.Name, + duration: t.Duration, + start: t.Start + }); + } + + list.sort(function (a, b) { return a.start - b.start; }); + return list; + }, + + getSqlTimings: function (root) { + var result = [], + addToResults = function (timing) { + if (timing.SqlTimings) { + for (var i = 0, sqlTiming; i < timing.SqlTimings.length; i++) { + sqlTiming = timing.SqlTimings[i]; + + // HACK: add info about the parent Timing to each SqlTiming so UI can render + sqlTiming.ParentTimingName = timing.Name; + result.push(sqlTiming); + } + } + + if (timing.Children) { + for (var i = 0; i < timing.Children.length; i++) { + addToResults(timing.Children[i]); + } + } + }; + + // start adding at the root and recurse down + addToResults(root); + + var removeDuration = function (list, duration) { + + var newList = []; + for (var i = 0; i < list.length; i++) { + + var item = list[i]; + if (duration.start > item.start) { + if (duration.start > item.finish) { + newList.push(item); + continue; + } + newList.push({ start: item.start, finish: duration.start }); + } + + if (duration.finish < item.finish) { + if (duration.finish < item.start) { + newList.push(item); + continue; + } + newList.push({ start: duration.finish, finish: item.finish }); + } + } + + return newList; + } + + var processTimes = function (elem, parent) { + var duration = { start: elem.StartMilliseconds, finish: (elem.StartMilliseconds + elem.DurationMilliseconds) }; + elem.richTiming = [duration]; + if (parent != null) { + elem.parent = parent; + elem.parent.richTiming = removeDuration(elem.parent.richTiming, duration); + } + + if (elem.Children) { + for (var i = 0; i < elem.Children.length; i++) { + processTimes(elem.Children[i], elem); + } + } + }; + + processTimes(root, null); + + // sort results by time + result.sort(function (a, b) { return a.StartMilliseconds - b.StartMilliseconds; }); + + var determineOverlap = function (gap, node) { + var overlap = 0; + for (var i = 0; i < node.richTiming.length; i++) { + var current = node.richTiming[i]; + if (current.start > gap.finish) { + break; + } + if (current.finish < gap.start) { + continue; + } + + overlap += Math.min(gap.finish, current.finish) - Math.max(gap.start, current.start); + } + return overlap; + } + + var determineGap = function (gap, node, match) { + var overlap = determineOverlap(gap, node); + if (match == null || overlap > match.duration) { + match = { name: node.Name, duration: overlap }; + } + else if (match.name == node.Name) { + match.duration += overlap; + } + + if (node.Children) { + for (var i = 0; i < node.Children.length; i++) { + match = determineGap(gap, node.Children[i], match); + } + } + return match; + }; + + var time = 0; + var prev = null; + $.each(result, function () { + this.prevGap = { + duration: (this.StartMilliseconds - time).toFixed(2), + start: time, + finish: this.StartMilliseconds + }; + + this.prevGap.topReason = determineGap(this.prevGap, root, null); + + time = this.StartMilliseconds + this.DurationMilliseconds; + prev = this; + }); + + + if (result.length > 0) { + var me = result[result.length - 1]; + me.nextGap = { + duration: (root.DurationMilliseconds - time).toFixed(2), + start: time, + finish: root.DurationMilliseconds + }; + me.nextGap.topReason = determineGap(me.nextGap, root, null); + } + + return result; + }, + + getSqlTimingsCount: function (root) { + var result = 0, + countSql = function (timing) { + if (timing.SqlTimings) { + result += timing.SqlTimings.length; + } + + if (timing.Children) { + for (var i = 0; i < timing.Children.length; i++) { + countSql(timing.Children[i]); + } + } + }; + countSql(root); + return result; + }, + + fetchResultsExposed: function (ids) { + return fetchResults(ids); + }, + + formatDuration: function (duration) { + return (duration || 0).toFixed(1); + } + }; +})(); + +MiniProfiler.init(); + + +// prettify.js +// http://code.google.com/p/google-code-prettify/ + +window.PR_SHOULD_USE_CONTINUATION=true;window.PR_TAB_WIDTH=8;window.PR_normalizedHtml=window.PR=window.prettyPrintOne=window.prettyPrint=void 0;window._pr_isIE6=function(){var y=navigator&&navigator.userAgent&&navigator.userAgent.match(/\bMSIE ([678])\./);y=y?+y[1]:false;window._pr_isIE6=function(){return y};return y}; +(function(){function y(b){return b.replace(L,"&").replace(M,"<").replace(N,">")}function H(b,f,i){switch(b.nodeType){case 1:var o=b.tagName.toLowerCase();f.push("<",o);var l=b.attributes,n=l.length;if(n){if(i){for(var r=[],j=n;--j>=0;)r[j]=l[j];r.sort(function(q,m){return q.name"); +for(l=b.firstChild;l;l=l.nextSibling)H(l,f,i);if(b.firstChild||!/^(?:br|link|img)$/.test(o))f.push("");break;case 3:case 4:f.push(y(b.nodeValue));break}}function O(b){function f(c){if(c.charAt(0)!=="\\")return c.charCodeAt(0);switch(c.charAt(1)){case "b":return 8;case "t":return 9;case "n":return 10;case "v":return 11;case "f":return 12;case "r":return 13;case "u":case "x":return parseInt(c.substring(2),16)||c.charCodeAt(1);case "0":case "1":case "2":case "3":case "4":case "5":case "6":case "7":return parseInt(c.substring(1), +8);default:return c.charCodeAt(1)}}function i(c){if(c<32)return(c<16?"\\x0":"\\x")+c.toString(16);c=String.fromCharCode(c);if(c==="\\"||c==="-"||c==="["||c==="]")c="\\"+c;return c}function o(c){var d=c.substring(1,c.length-1).match(RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));c=[];for(var a=[],k=d[0]==="^",e=k?1:0,h=d.length;e122)){s<65||g>90||a.push([Math.max(65,g)|32,Math.min(s,90)|32]);s<97||g>122||a.push([Math.max(97,g)&-33,Math.min(s,122)&-33])}}a.sort(function(v,w){return v[0]-w[0]||w[1]-v[1]});d=[];g=[NaN,NaN];for(e=0;eh[0]){h[1]+1>h[0]&&a.push("-"); +a.push(i(h[1]))}}a.push("]");return a.join("")}function l(c){for(var d=c.source.match(RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g")),a=d.length,k=[],e=0,h=0;e=2&&c==="[")d[e]=o(g);else if(c!=="\\")d[e]=g.replace(/[a-zA-Z]/g,function(s){s=s.charCodeAt(0);return"["+String.fromCharCode(s&-33,s|32)+"]"})}return d.join("")}for(var n=0,r=false,j=false,q=0,m=b.length;q=0;l-=16)o.push(" ".substring(0,l));l=n+1;break;case "\n":f=0;break;default:++f}if(!o)return i;o.push(i.substring(l));return o.join("")}}function I(b, +f,i,o){if(f){b={source:f,c:b};i(b);o.push.apply(o,b.d)}}function B(b,f){var i={},o;(function(){for(var r=b.concat(f),j=[],q={},m=0,t=r.length;m=0;)i[c.charAt(d)]=p;p=p[1];c=""+p;if(!q.hasOwnProperty(c)){j.push(p);q[c]=null}}j.push(/[\0-\uffff]/);o=O(j)})();var l=f.length;function n(r){for(var j=r.c,q=[j,z],m=0,t=r.source.match(o)||[],p={},c=0,d=t.length;c=5&&"lang-"===k.substring(0,5))&&!(e&&typeof e[1]==="string")){h=false;k=P}h||(p[a]=k)}g=m;m+=a.length;if(h){h=e[1];var s=a.indexOf(h),v=s+h.length;if(e[2]){v=a.length-e[2].length;s=v-h.length}k=k.substring(5);I(j+g,a.substring(0,s),n,q);I(j+g+s,h,Q(k,h),q);I(j+g+v,a.substring(v),n,q)}else q.push(j+g,k)}r.d=q}return n}function x(b){var f=[],i=[];if(b.tripleQuotedStrings)f.push([A,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, +null,"'\""]);else b.multiLineStrings?f.push([A,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"]):f.push([A,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"]);b.verbatimStrings&&i.push([A,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);if(b.hashComments)if(b.cStyleComments){f.push([C,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"]);i.push([A,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/, +null])}else f.push([C,/^#[^\r\n]*/,null,"#"]);if(b.cStyleComments){i.push([C,/^\/\/[^\r\n]*/,null]);i.push([C,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}b.regexLiterals&&i.push(["lang-regex",RegExp("^"+Z+"(/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/)")]);b=b.keywords.replace(/^\s+|\s+$/g,"");b.length&&i.push([R,RegExp("^(?:"+b.replace(/\s+/g,"|")+")\\b"),null]);f.push([z,/^\s+/,null," \r\n\t\u00a0"]);i.push([J,/^@[a-z_$][a-z_$@0-9]*/i,null],[S,/^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, +null],[z,/^[a-z_$][a-z_$@0-9]*/i,null],[J,/^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/i,null,"0123456789"],[E,/^.[^\s\w\.$@\'\"\`\/\#]*/,null]);return B(f,i)}function $(b){function f(D){if(D>r){if(j&&j!==q){n.push("");j=null}if(!j&&q){j=q;n.push('')}var T=y(p(i.substring(r,D))).replace(e?d:c,"$1 ");e=k.test(T);n.push(T.replace(a,s));r=D}}var i=b.source,o=b.g,l=b.d,n=[],r=0,j=null,q=null,m=0,t=0,p=Y(window.PR_TAB_WIDTH),c=/([\r\n ]) /g, +d=/(^| ) /gm,a=/\r\n?|\n/g,k=/[ \r\n]$/,e=true,h=window._pr_isIE6();h=h?b.b.tagName==="PRE"?h===6?" \r\n":h===7?" 
\r":" \r":" 
":"
";var g=b.b.className.match(/\blinenums\b(?::(\d+))?/),s;if(g){for(var v=[],w=0;w<10;++w)v[w]=h+'
  • ';var F=g[1]&&g[1].length?g[1]-1:0;n.push('
    1. ");s=function(){var D=v[++F%10];return j?""+D+'':D}}else s=h; +for(;;)if(m");j=null}n.push(o[m+1]);m+=2}else if(t");g&&n.push("
    ");b.a=n.join("")}function u(b,f){for(var i=f.length;--i>=0;){var o=f[i];if(G.hasOwnProperty(o))"console"in window&&console.warn("cannot override language handler %s",o);else G[o]=b}}function Q(b,f){b&&G.hasOwnProperty(b)||(b=/^\s*1&&m.charAt(0)==="<"){if(!ba.test(m))if(ca.test(m)){f.push(m.substring(9,m.length-3));n+=m.length-12}else if(da.test(m)){f.push("\n");++n}else if(m.indexOf(V)>=0&&m.replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,' $1="$2$3$4"').match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/)){var t=m.match(W)[2],p=1,c;c=j+1;a:for(;c=0;){var e=p.indexOf(";",k);if(e>=0){var h=p.substring(k+3,e),g=10;if(h&&h.charAt(0)==="x"){h=h.substring(1);g=16}var s=parseInt(h,g);isNaN(s)||(p=p.substring(0,k)+String.fromCharCode(s)+p.substring(e+1))}}a=p.replace(ea,"<").replace(fa,">").replace(ga,"'").replace(ha,'"').replace(ia," ").replace(ja, +"&")}f.push(a);n+=a.length}}o={source:f.join(""),h:r};var v=o.source;b.source=v;b.c=0;b.g=o.h;Q(i,v)(b);$(b)}catch(w){if("console"in window)console.log(w&&w.stack?w.stack:w)}}var A="str",R="kwd",C="com",S="typ",J="lit",E="pun",z="pln",P="src",V="nocode",Z=function(){for(var b=["!","!=","!==","#","%","%=","&","&&","&&=","&=","(","*","*=","+=",",","-=","->","/","/=",":","::",";","<","<<","<<=","<=","=","==","===",">",">=",">>",">>=",">>>",">>>=","?","@","[","^","^=","^^","^^=","{","|","|=","||","||=", +"~","break","case","continue","delete","do","else","finally","instanceof","return","throw","try","typeof"],f="(?:^^|[+-]",i=0;i:&a-z])/g,"\\$1");f+=")\\s*";return f}(),L=/&/g,M=//g,X=/\"/g,ea=/</g,fa=/>/g,ga=/'/g,ha=/"/g,ja=/&/g,ia=/ /g,ka=/[\r\n]/g,K=null,aa=RegExp("[^<]+|Qn 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®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

    SQr#?+IP>OI!yu3}VWsHenLMYx$ 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

    1AadFG61|4_*Zh$_QIia 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�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

    4ylqx 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 literal 0 HcmV?d00001 diff --git a/packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/System.Threading.xml b/packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/System.Threading.xml new file mode 100644 index 0000000..8fc7b65 --- /dev/null +++ b/packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/System.Threading.xml @@ -0,0 +1,19811 @@ + + + + System.Threading + + + +

    + A stub version of .NET 4.0 contracts. + + + + + A dummy class that implements GetResourceString. Environment.GetResourceString(string) is an internal + method in mscorlib.dll. + + + + + An interface similar to the one added in .NET 4.0. + + + + + .NET 4.0 Monitor class supports new overloads that return a boolean value + representing whether the lock was successfully taken or not. The return value + is meant to be accurate even in the presence of thread aborts. + + Monitor2 implements these methods as simple wrappers over the .NET 3.5 methods, + but without making the guarantees related to thread aborts. + + + + + This internal class from mscorlib.dll is used by ConcurrentDictionary. + + + + + OperationCanceledException is changing from .NET 3.5 to .NET 4.0. To make Parallel Extensions work, + we include the new version as OperationCanceledException2. + + + + + A convenience class for common platform-related logic. + + + + + Gets the number of available processors available to this process on the current machine. + + + + + A dummy replacement for the .NET 4.0 SecuritySafeCriticalAttribute. The dummy attribute makes the + code compile, but we are likely losing the ability to be called from a partial trust environment. + + + + + A dummy replacement for the .NET internal class StackCrawlMark. + + + + + Represents a thread-safe collection of keys and values. + + The type of the keys in the dictionary. + The type of the values in the dictionary. + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads. + + + + + Initializes a new instance of the + class that is empty, has the default concurrency level, has the default initial capacity, and + uses the default comparer for the key type. + + + + + Initializes a new instance of the + class that is empty, has the specified concurrency level and capacity, and uses the default + comparer for the key type. + + The estimated number of threads that will update the + concurrently. + The initial number of elements that the + can contain. + is + less than 1. + is less than + 0. + + + + Initializes a new instance of the + class that contains elements copied from the specified , has the default concurrency + level, has the default initial capacity, and uses the default comparer for the key type. + + The whose elements are copied to + the new + . + is a null reference + (Nothing in Visual Basic). + contains one or more + duplicate keys. + + + + Initializes a new instance of the + class that is empty, has the specified concurrency level and capacity, and uses the specified + . + + The + implementation to use when comparing keys. + is a null reference + (Nothing in Visual Basic). + + + + Initializes a new instance of the + class that contains elements copied from the specified , has the default concurrency level, has the default + initial capacity, and uses the specified + . + + The whose elements are copied to + the new + . + The + implementation to use when comparing keys. + is a null reference + (Nothing in Visual Basic). -or- + is a null reference (Nothing in Visual Basic). + + + + + Initializes a new instance of the + class that contains elements copied from the specified , + has the specified concurrency level, has the specified initial capacity, and uses the specified + . + + The estimated number of threads that will update the + concurrently. + The whose elements are copied to the new + . + The implementation to use + when comparing keys. + + is a null reference (Nothing in Visual Basic). + -or- + is a null reference (Nothing in Visual Basic). + + + is less than 1. + + contains one or more duplicate keys. + + + + Initializes a new instance of the + class that is empty, has the specified concurrency level, has the specified initial capacity, and + uses the specified . + + The estimated number of threads that will update the + concurrently. + The initial number of elements that the + can contain. + The + implementation to use when comparing keys. + + is less than 1. -or- + is less than 0. + + is a null reference + (Nothing in Visual Basic). + + + + Attempts to add the specified key and value to the . + + The key of the element to add. + The value of the element to add. The value can be a null reference (Nothing + in Visual Basic) for reference types. + true if the key/value pair was added to the + successfully; otherwise, false. + is null reference + (Nothing in Visual Basic). + The + contains too many elements. + + + + Determines whether the contains the specified + key. + + The key to locate in the . + true if the contains an element with + the specified key; otherwise, false. + is a null reference + (Nothing in Visual Basic). + + + + Attempts to remove and return the the value with the specified key from the + . + + The key of the element to remove and return. + When this method returns, contains the object removed from the + or the default value of + if the operation failed. + true if an object was removed successfully; otherwise, false. + is a null reference + (Nothing in Visual Basic). + + + + Removes the specified key from the dictionary if it exists and returns its associated value. + If matchValue flag is set, the key will be removed only if is associated with a particular + value. + + The key to search for and remove if it exists. + The variable into which the removed value, if found, is stored. + Whether removal of the key is conditional on its value. + The conditional value to compare against if is true + + + + + Attempts to get the value associated with the specified key from the . + + The key of the value to get. + When this method returns, contains the object from + the + with the spedified key or the default value of + , if the operation failed. + true if the key was found in the ; + otherwise, false. + is a null reference + (Nothing in Visual Basic). + + + + Compares the existing value for the specified key with a specified value, and if they’re equal, + updates the key with a third value. + + The key whose value is compared with and + possibly replaced. + The value that replaces the value of the element with if the comparison results in equality. + The value that is compared to the value of the element with + . + true if the value with was equal to and replaced with ; otherwise, + false. + is a null + reference. + + + + Removes all keys and values from the . + + + + + Copies the elements of the to an array of + type , starting at the + specified array index. + + The one-dimensional array of type + that is the destination of the elements copied from the . The array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference + (Nothing in Visual Basic). + is less than + 0. + is equal to or greater than + the length of the . -or- The number of elements in the source + is greater than the available space from to the end of the destination + . + + + + Copies the key and value pairs stored in the to a + new array. + + A new array containing a snapshot of key and value pairs copied from the . + + + + Copy dictionary contents to an array - shared implementation between ToArray and CopyTo. + + Important: the caller must hold all locks in m_locks before calling CopyToPairs. + + + + + Copy dictionary contents to an array - shared implementation between ToArray and CopyTo. + + Important: the caller must hold all locks in m_locks before calling CopyToEntries. + + + + + Copy dictionary contents to an array - shared implementation between ToArray and CopyTo. + + Important: the caller must hold all locks in m_locks before calling CopyToObjects. + + + + Returns an enumerator that iterates through the . + An enumerator for the . + + The enumerator returned from the dictionary is safe to use concurrently with + reads and writes to the dictionary, however it does not represent a moment-in-time snapshot + of the dictionary. The contents exposed through the enumerator may contain modifications + made to the dictionary after was called. + + + + + Shared internal implementation for inserts and updates. + If key exists, we always return false; and if updateIfExists == true we force update with value; + If key doesn't exist, we always add value and return true; + + + + + Adds a key/value pair to the + if the key does not already exist. + + The key of the element to add. + The function used to generate a value for the key + is a null reference + (Nothing in Visual Basic). + is a null reference + (Nothing in Visual Basic). + The dictionary contains too many + elements. + The value for the key. This will be either the existing value for the key if the + key is already in the dictionary, or the new value for the key as returned by valueFactory + if the key was not in the dictionary. + + + + Adds a key/value pair to the + if the key does not already exist. + + The key of the element to add. + the value to be added, if the key does not already exist + is a null reference + (Nothing in Visual Basic). + The dictionary contains too many + elements. + The value for the key. This will be either the existing value for the key if the + key is already in the dictionary, or the new value if the key was not in the dictionary. + + + + Adds a key/value pair to the if the key does not already + exist, or updates a key/value pair in the if the key + already exists. + + The key to be added or whose value should be updated + The function used to generate a value for an absent key + The function used to generate a new value for an existing key + based on the key's existing value + is a null reference + (Nothing in Visual Basic). + is a null reference + (Nothing in Visual Basic). + is a null reference + (Nothing in Visual Basic). + The dictionary contains too many + elements. + The new value for the key. This will be either be the result of addValueFactory (if the key was + absent) or the result of updateValueFactory (if the key was present). + + + + Adds a key/value pair to the if the key does not already + exist, or updates a key/value pair in the if the key + already exists. + + The key to be added or whose value should be updated + The value to be added for an absent key + The function used to generate a new value for an existing key based on + the key's existing value + is a null reference + (Nothing in Visual Basic). + is a null reference + (Nothing in Visual Basic). + The dictionary contains too many + elements. + The new value for the key. This will be either be the result of addValueFactory (if the key was + absent) or the result of updateValueFactory (if the key was present). + + + + Adds the specified key and value to the . + + The object to use as the key of the element to add. + The object to use as the value of the element to add. + is a null reference + (Nothing in Visual Basic). + The dictionary contains too many + elements. + + An element with the same key already exists in the . + + + + Removes the element with the specified key from the . + + The key of the element to remove. + true if the element is successfully remove; otherwise false. This method also returns + false if + was not found in the original . + + is a null reference + (Nothing in Visual Basic). + + + + Adds the specified value to the + with the specified key. + + The + structure representing the key and value to add to the . + The of is null. + The + contains too many elements. + An element with the same key already exists in the + + + + + Determines whether the + contains a specific key and value. + + The + structure to locate in the . + true if the is found in the ; otherwise, false. + + + + Removes a key and value from the dictionary. + + The + structure representing the key and value to remove from the . + true if the key and value represented by is successfully + found and removed; otherwise, false. + The Key property of is a null reference (Nothing in Visual Basic). + + + Returns an enumerator that iterates through the . + An enumerator for the . + + The enumerator returned from the dictionary is safe to use concurrently with + reads and writes to the dictionary, however it does not represent a moment-in-time snapshot + of the dictionary. The contents exposed through the enumerator may contain modifications + made to the dictionary after was called. + + + + + Adds the specified key and value to the dictionary. + + The object to use as the key. + The object to use as the value. + is a null reference + (Nothing in Visual Basic). + The dictionary contains too many + elements. + + is of a type that is not assignable to the key type of the . -or- + is of a type that is not assignable to , + the type of values in the . + -or- A value with the same key already exists in the . + + + + + Gets whether the contains an + element with the specified key. + + The key to locate in the . + true if the contains + an element with the specified key; otherwise, false. + is a null reference + (Nothing in Visual Basic). + + + Provides an for the + . + An for the . + + + + Removes the element with the specified key from the . + + The key of the element to remove. + is a null reference + (Nothing in Visual Basic). + + + + Copies the elements of the to an array, starting + at the specified array index. + + The one-dimensional array that is the destination of the elements copied from + the . The array must have zero-based + indexing. + The zero-based index in at which copying + begins. + is a null reference + (Nothing in Visual Basic). + is less than + 0. + is equal to or greater than + the length of the . -or- The number of elements in the source + is greater than the available space from to the end of the destination + . + + + + Replaces the internal table with a larger one. To prevent multiple threads from resizing the + table as a result of races, the table of buckets that was deemed too small is passed in as + an argument to GrowTable(). GrowTable() obtains a lock, and then checks whether the bucket + table has been replaced in the meantime or not. + + Reference to the bucket table that was deemed too small. + + + + Computes the bucket and lock number for a particular key. + + + + + Acquires all locks for this hash table, and increments locksAcquired by the number + of locks that were successfully acquired. The locks are acquired in an increasing + order. + + + + + Acquires a contiguous range of locks for this hash table, and increments locksAcquired + by the number of locks that were successfully acquired. The locks are acquired in an + increasing order. + + + + + Releases a contiguous range of locks. + + + + + Gets a collection containing the keys in the dictionary. + + + + + Gets a collection containing the values in the dictionary. + + + + + A helper method for asserts. + + + + + A helper function to obtain the string for a particular resource key. + + + + + + + Get the data array to be serialized + + + + + Construct the dictionary from a previously seiralized one + + + + + Gets or sets the value associated with the specified key. + + The key of the value to get or set. + The value associated with the specified key. If the specified key is not found, a get + operation throws a + , and a set operation creates a new + element with the specified key. + is a null reference + (Nothing in Visual Basic). + The property is retrieved and + + does not exist in the collection. + + + + Gets the number of key/value pairs contained in the . + + The dictionary contains too many + elements. + The number of key/value paris contained in the . + Count has snapshot semantics and represents the number of items in the + at the moment when Count was accessed. + + + + Gets a value that indicates whether the is empty. + + true if the is empty; otherwise, + false. + + + + Gets a collection containing the keys in the . + + An containing the keys in the + . + + + + Gets a collection containing the values in the . + + An containing the values in + the + . + + + + Gets a value indicating whether the dictionary is read-only. + + true if the is + read-only; otherwise, false. For , this property always returns + false. + + + + Gets a value indicating whether the has a fixed size. + + true if the has a + fixed size; otherwise, false. For , this property always + returns false. + + + + Gets a value indicating whether the is read-only. + + true if the is + read-only; otherwise, false. For , this property always + returns false. + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + + Gets an containing the values in the . + + An containing the values in the . + + + + Gets or sets the value associated with the specified key. + + The key of the value to get or set. + The value associated with the specified key, or a null reference (Nothing in Visual Basic) + if is not in the dictionary or is of a type that is + not assignable to the key type of the . + is a null reference + (Nothing in Visual Basic). + + A value is being assigned, and is of a type that is not assignable to the + key type of the . -or- A value is being + assigned, and is of a type that is not assignable to the value type + of the + + + + + Gets a value indicating whether access to the is + synchronized with the SyncRoot. + + true if access to the is synchronized + (thread safe); otherwise, false. For , this property always + returns false. + + + + Gets an object that can be used to synchronize access to the . This property is not supported. + + The SyncRoot property is not supported. + + + + The number of concurrent writes for which to optimize by default. + + + + + A node in a singly-linked list representing a particular hash table bucket. + + + + + A private class to represent enumeration over the dictionary that implements the + IDictionaryEnumerator interface. + + + + + Represents a thread-safe first-in, first-out collection of objects. + + Specifies the type of elements in the queue. + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads. + + + + + Defines methods to manipulate thread-safe collections intended for producer/consumer usage. + + Specifies the type of elements in the collection. + + All implementations of this interface must enable all members of this interface + to be used concurrently from multiple threads. + + + + + Copies the elements of the to + an + , starting at a specified index. + + The one-dimensional that is the destination of + the elements copied from the . + The array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- The number of elements in the source is greater than the + available space from to the end of the destination . + + + + + Attempts to add an object to the . + + The object to add to the . + true if the object was added successfully; otherwise, false. + The was invalid for this collection. + + + + Attempts to remove and return an object from the . + + + When this method returns, if the object was removed and returned successfully, contains the removed object. If no object was available to be removed, the value is + unspecified. + + true if an object was removed and returned successfully; otherwise, false. + + + + Copies the elements contained in the to a new array. + + A new array containing the elements copied from the . + + + + Initializes a new instance of the class. + + + + + Initializes the contents of the queue from an existing collection. + + A collection from which to copy elements. + + + + Initializes a new instance of the + class that contains elements copied from the specified collection + + The collection whose elements are copied to the new . + The argument is + null. + + + + Get the data array to be serialized + + + + + Construct the queue from a previously seiralized one + + + + + Copies the elements of the to an , starting at a particular + index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + + is multidimensional. -or- + does not have zero-based indexing. -or- + is equal to or greater than the length of the + -or- The number of elements in the source is + greater than the available space from to the end of the destination + . -or- The type of the source cannot be cast automatically to the type of the + destination . + + + + + Returns an enumerator that iterates through a collection. + + An that can be used to iterate through the collection. + + + + Attempts to add an object to the . + + The object to add to the . The value can be a null + reference (Nothing in Visual Basic) for reference types. + + true if the object was added successfully; otherwise, false. + For , this operation will always add the object to the + end of the + and return true. + + + + Attempts to remove and return an object from the . + + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned succesfully; otherwise, false. + For , this operation will attempt to remove the object + from the beginning of the . + + + + + Copies the elements stored in the to a new array. + + A new array containing a snapshot of elements copied from the . + + + + Copies the elements to a new . + + A new containing a snapshot of + elements copied from the . + + + + Store the position of the current head and tail positions. + + return the head segment + return the tail segment + return the head offset + return the tail offset + + + + Copies the elements to an existing one-dimensional Array, starting at the specified array index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based + indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- The number of elements in the source is greater than the + available space from to the end of the destination . + + + + + Returns an enumerator that iterates through the . + + An enumerator for the contents of the . + + The enumeration represents a moment-in-time snapshot of the contents + of the queue. It does not reflect any updates to the collection after + was called. The enumerator is safe to use + concurrently with reads from and writes to the queue. + + + + + Adds an object to the end of the . + + The object to add to the end of the . The value can be a null reference + (Nothing in Visual Basic) for reference types. + + + + + Attempts to remove and return the object at the beginning of the . + + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned from the beggining of the + succesfully; otherwise, false. + + + + Attempts to return an object from the beginning of the + without removing it. + + When this method returns, contains an object from + the beginning of the or an + unspecified value if the operation failed. + true if and object was returned successfully; otherwise, false. + + + + Gets a value indicating whether access to the is + synchronized with the SyncRoot. + + true if access to the is synchronized + with the SyncRoot; otherwise, false. For , this property always + returns false. + + + + Gets an object that can be used to synchronize access to the . This property is not supported. + + The SyncRoot property is not supported. + + + + Gets a value that indicates whether the is empty. + + true if the is empty; otherwise, false. + + For determining whether the collection contains any items, use of this property is recommended + rather than retrieving the number of items from the property and comparing it + to 0. However, as this collection is intended to be accessed concurrently, it may be the case + that another thread will modify the collection after returns, thus invalidating + the result. + + + + + Gets the number of elements contained in the . + + The number of elements contained in the . + + For determining whether the collection contains any items, use of the + property is recommended rather than retrieving the number of items from the + property and comparing it to 0. + + + + + private class for ConcurrentQueue. + a queue is a linked list of small arrays, each node is called a segment. + A segment contains an array, a pointer to the next segment, and m_low, m_high indices recording + the first and last valid elements of the array. + + + + + Create and initialize a segment with the specified index. + + + + + Add an element to the tail of the current segment + exclusively called by ConcurrentQueue.InitializedFromCollection + InitializeFromCollection is responsible to guaratee that there is no index overflow, + and there is no contention + + + + + + Create a new segment and append to the current one + Does not update the m_tail pointer + exclusively called by ConcurrentQueue.InitializedFromCollection + InitializeFromCollection is responsible to guaratee that there is no index overflow, + and there is no contention + + the reference to the new Segment + + + + Create a new segment and append to the current one + Update the m_tail pointer + This method is called when there is no contention + + + + + Try to append an element at the end of this segment. + + the element to append + The tail. + true if the element is appended, false if the current segment is full + if appending the specified element succeeds, and after which the segment is full, + then grow the segment + + + + try to remove an element from the head of current segment + + The result. + The head. + return false only if the current segment is empty + + + + try to peek the current segment + + holds the return value of the element at the head position, + value set to default(T) if there is no such an element + true if there are elements in the current segment, false otherwise + + + + Convert part or all of the current segment into a List + + the start position + the end position + the result list + + + + return the next segment + + + + + return true if the current segment is empty (doesn't have any element available to dequeue, + false otherwise + + + + + return the position of the head of the current segment + + + + + return the logical position of the tail of the current segment + + + + + Represents a thread-safe last-in, first-out collection of objects. + + Specifies the type of elements in the stack. + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads. + + + + + Initializes a new instance of the + class. + + + + + Initializes a new instance of the + class that contains elements copied from the specified collection + + The collection whose elements are copied to the new . + The argument is + null. + + + + Initializes the contents of the stack from an existing collection. + + A collection from which to copy elements. + + + + Get the data array to be serialized + + + + + Construct the stack from a previously seiralized one + + + + + Removes all objects from the . + + + + + Copies the elements of the to an , starting at a particular + index. + + The one-dimensional that is the destination of + the elements copied from the + . The must + have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + + is multidimensional. -or- + does not have zero-based indexing. -or- + is equal to or greater than the length of the + -or- The number of elements in the source is + greater than the available space from to the end of the destination + . -or- The type of the source cannot be cast automatically to the type of the + destination . + + + + + Copies the elements to an existing one-dimensional , starting at the specified array index. + + The one-dimensional that is the destination of + the elements copied from the + . The must have zero-based + indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- The number of elements in the source is greater than the + available space from to the end of the destination . + + + + + Inserts an object at the top of the . + + The object to push onto the . The value can be + a null reference (Nothing in Visual Basic) for reference types. + + + + + Inserts multiple objects at the top of the atomically. + + The objects to push onto the . + is a null reference + (Nothing in Visual Basic). + + When adding multiple items to the stack, using PushRange is a more efficient + mechanism than using one item at a time. Additionally, PushRange + guarantees that all of the elements will be added atomically, meaning that no other threads will + be able to inject elements between the elements being pushed. Items at lower indices in + the array will be pushed before items at higher indices. + + + + + Inserts multiple objects at the top of the atomically. + + The objects to push onto the . + The zero-based offset in at which to begin + inserting elements onto the top of the . + The number of elements to be inserted onto the top of the . + is a null reference + (Nothing in Visual Basic). + or is negative. Or is greater than or equal to the length + of . + + is + greater than the length of . + + When adding multiple items to the stack, using PushRange is a more efficient + mechanism than using one item at a time. Additionally, PushRange + guarantees that all of the elements will be added atomically, meaning that no other threads will + be able to inject elements between the elements being pushed. Items at lower indices in the + array will be pushed before items at higher indices. + + + + + Push one or many nodes into the stack, if head and tails are equal then push one node to the stack other wise push the list between head + and tail to the stack + + The head pointer to the new list + The tail pointer to the new list + + + + Local helper function to validate the Pop Push range methods input + + + + + Attempts to add an object to the . + + The object to add to the . The value can be a null + reference (Nothing in Visual Basic) for reference types. + + true if the object was added successfully; otherwise, false. + For , this operation + will always insert the object onto the top of the + and return true. + + + + Attempts to return an object from the top of the + without removing it. + + When this method returns, contains an object from + the top of the or an + unspecified value if the operation failed. + true if and object was returned successfully; otherwise, false. + + + + Attempts to pop and return the object at the top of the . + + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned from the top of the + succesfully; otherwise, false. + + + + Attempts to pop and return multiple objects from the top of the + atomically. + + + The to which objects popped from the top of the will be added. + + The number of objects successfully popped from the top of the and inserted in + . + is a null argument (Nothing + in Visual Basic). + + When popping multiple items, if there is little contention on the stack, using + TryPopRange can be more efficient than using + once per item to be removed. Nodes fill the + with the first node to be popped at the startIndex, the second node to be popped + at startIndex + 1, and so on. + + + + + Attempts to pop and return multiple objects from the top of the + atomically. + + + The to which objects popped from the top of the will be added. + + The zero-based offset in at which to begin + inserting elements from the top of the . + The number of elements to be popped from top of the and inserted into . + is a null reference + (Nothing in Visual Basic). + or is negative. Or is greater than or equal to the length + of . + + is + greater than the length of . + + When popping multiple items, if there is little contention on the stack, using + TryPopRange can be more efficient than using + once per item to be removed. Nodes fill the + with the first node to be popped at the startIndex, the second node to be popped + at startIndex + 1, and so on. + + + + + Local helper function to Pop an item from the stack, slow path + + The popped item + True if succeeded, false otherwise + + + + Slow path helper for TryPop. This method assumes an initial attempt to pop an element + has already occurred and failed, so it begins spinning right away. + + The number of items to pop. + + When this method returns, if the pop succeeded, contains the removed object. If no object was + available to be removed, the value is unspecified. This parameter is passed uninitialized. + + True if an element was removed and returned; otherwise, false. + + + + Local helper function to copy the poped elements into a given collection + + The head of the list to be copied + The collection to place the popped items in + the beginning of index of where to place the popped items + The number of nodes. + + + + Attempts to remove and return an object from the . + + + When this method returns, if the operation was successful, contains the + object removed. If no object was available to be removed, the value is unspecified. + + true if an element was removed and returned succesfully; otherwise, false. + For , this operation will attempt to pope the object at + the top of the . + + + + + Copies the items stored in the to a new array. + + A new array containing a snapshot of elements copied from the . + + + + Returns an array containing a snapshot of the list's contents, using + the target list node as the head of a region in the list. + + An array of the list's contents. + + + + Returns an enumerator that iterates through the . + + An enumerator for the . + + The enumeration represents a moment-in-time snapshot of the contents + of the stack. It does not reflect any updates to the collection after + was called. The enumerator is safe to use + concurrently with reads from and writes to the stack. + + + + + Returns an enumerator that iterates through a collection. + + An that can be used to iterate through + the collection. + + The enumeration represents a moment-in-time snapshot of the contents of the stack. It does not + reflect any updates to the collection after + was called. The enumerator is safe to use concurrently with reads + from and writes to the stack. + + + + + Gets a value that indicates whether the is empty. + + true if the is empty; otherwise, false. + + For determining whether the collection contains any items, use of this property is recommended + rather than retrieving the number of items from the property and comparing it + to 0. However, as this collection is intended to be accessed concurrently, it may be the case + that another thread will modify the collection after returns, thus invalidating + the result. + + + + + Gets the number of elements contained in the . + + The number of elements contained in the . + + For determining whether the collection contains any items, use of the + property is recommended rather than retrieving the number of items from the + property and comparing it to 0. + + + + + Gets a value indicating whether access to the is + synchronized with the SyncRoot. + + true if access to the is synchronized + with the SyncRoot; otherwise, false. For , this property always + returns false. + + + + Gets an object that can be used to synchronize access to the . This property is not supported. + + The SyncRoot property is not supported + + + + A simple (internal) node type used to store elements of concurrent stacks and queues. + + + + + Constructs a new node with the specified value and no next node. + + The value of the node. + + + + A debugger view of the IProducerConsumerCollection that makes it simple to browse the + collection's contents at a point in time. + + The type of elements stored within. + + + + Constructs a new debugger view object for the provided collection object. + + A collection to browse in the debugger. + + + + Returns a snapshot of the underlying collection's elements. + + + + + Represents a particular manner of splitting an orderable data source into multiple partitions. + + Type of the elements in the collection. + + + Each element in each partition has an integer index associated with it, which determines the relative + order of that element against elements in other partitions. + + + Inheritors of must adhere to the following rules: +
      +
    1. All indices must be unique, such that there may not be duplicate indices. If all indices are not + unique, the output ordering may be scrambled.
    2. +
    3. All indices must be non-negative. If any indices are negative, consumers of the implementation + may throw exceptions.
    4. +
    5. and should throw a + if the requested partition count is less than or + equal to zero.
    6. +
    7. and should always return a number + of enumerables equal to the requested partition count. If the partitioner runs out of data and cannot + create as many partitions as requested, an empty enumerator should be returned for each of the + remaining partitions. If this rule is not followed, consumers of the implementation may throw a .
    8. +
    9. , , + , and + should never return null. If null is returned, a consumer of the implementation may throw a + .
    10. +
    11. , , + , and + should always return partitions that can fully and uniquely enumerate the input data source. All of + the data and only the data contained in the input source should be enumerated, with no duplication + that was not already in the input, unless specifically required by the particular partitioner's + design. If this is not followed, the output ordering may be scrambled.
    12. +
    13. If returns true, each partition must return elements + with increasing key indices.
    14. +
    15. If returns true, all the keys in partition numbered N + must be larger than all the keys in partition numbered N-1.
    16. +
    17. If returns true, all indices must be monotonically increasing from + 0, though not necessarily within a single partition.
    18. +
    +
    +
    +
    + + + Represents a particular manner of splitting a data source into multiple partitions. + + Type of the elements in the collection. + + + Inheritors of must adhere to the following rules: +
      +
    1. should throw a + if the requested partition count is less than or + equal to zero.
    2. +
    3. should always return a number of enumerables equal to the requested + partition count. If the partitioner runs out of data and cannot create as many partitions as + requested, an empty enumerator should be returned for each of the remaining partitions. If this rule + is not followed, consumers of the implementation may throw a .
    4. +
    5. and + should never return null. If null is returned, a consumer of the implementation may throw a + .
    6. +
    7. and should always return + partitions that can fully and uniquely enumerate the input data source. All of the data and only the + data contained in the input source should be enumerated, with no duplication that was not already in + the input, unless specifically required by the particular partitioner's design. If this is not + followed, the output ordering may be scrambled.
    8. +
    +
    +
    +
    + + + Partitions the underlying collection into the given number of partitions. + + The number of partitions to create. + A list containing enumerators. + + + + Creates an object that can partition the underlying collection into a variable number of + partitions. + + + + The returned object implements the interface. Calling GetEnumerator on the + object creates another partition over the sequence. + + + The method is only supported if the + property returns true. + + + An object that can create partitions over the underlying data source. + Dynamic partitioning is not supported by this + partitioner. + + + + Gets whether additional partitions can be created dynamically. + + + true if the can create partitions dynamically as they are + requested; false if the can only allocate + partitions statically. + + + + If a derived class does not override and implement , + should return false. The value of should not vary over the lifetime of this instance. + + + + + + Initializes a new instance of the class with the + specified constraints on the index keys. + + + Indicates whether the elements in each partition are yielded in the order of + increasing keys. + + + Indicates whether elements in an earlier partition always come before + elements in a later partition. If true, each element in partition 0 has a smaller order key than + any element in partition 1, each element in partition 1 has a smaller order key than any element + in partition 2, and so on. + + + Indicates whether keys are normalized. If true, all order keys are distinct + integers in the range [0 .. numberOfElements-1]. If false, order keys must still be dictinct, but + only their relative order is considered, not their absolute values. + + + + + Partitions the underlying collection into the specified number of orderable partitions. + + + Each partition is represented as an enumerator over key-value pairs. + The value of the pair is the element itself, and the key is an integer which determines + the relative ordering of this element against other elements in the data source. + + The number of partitions to create. + A list containing enumerators. + + + + Creates an object that can partition the underlying collection into a variable number of + partitions. + + + + The returned object implements the interface. Calling GetEnumerator on the + object creates another partition over the sequence. + + + Each partition is represented as an enumerator over key-value pairs. The value in the pair is the element + itself, and the key is an integer which determines the relative ordering of this element against + other elements. + + + The method is only supported if the SupportsDynamicPartitions + property returns true. + + + An object that can create partitions over the underlying data source. + Dynamic partitioning is not supported by this + partitioner. + + + + Partitions the underlying collection into the given number of ordered partitions. + + + The default implementation provides the same behavior as except + that the returned set of partitions does not provide the keys for the elements. + + The number of partitions to create. + A list containing enumerators. + + + + Creates an object that can partition the underlying collection into a variable number of + partitions. + + + + The returned object implements the interface. Calling GetEnumerator on the + object creates another partition over the sequence. + + + The default implementation provides the same behavior as except + that the returned set of partitions does not provide the keys for the elements. + + + The method is only supported if the + property returns true. + + + An object that can create partitions over the underlying data source. + Dynamic partitioning is not supported by this + partitioner. + + + + Gets whether elements in each partition are yielded in the order of increasing keys. + + + + + Gets whether elements in an earlier partition always come before elements in a later partition. + + + If returns true, each element in partition 0 has a + smaller order key than any element in partition 1, each element in partition 1 has a smaller + order key than any element in partition 2, and so on. + + + + + Gets whether order keys are normalized. + + + If returns true, all order keys are distinct integers in the range + [0 .. numberOfElements-1]. If the property returns false, order keys must still be dictinct, but + only their relative order is considered, not their absolute values. + + + + + Converts an enumerable over key-value pairs to an enumerable over values. + + + + + Provides common partitioning strategies for arrays, lists, and enumerables. + + + + The static methods on are all thread-safe and may be used concurrently + from multiple threads. However, while a created partitioner is in use, the underlying data source + should not be modified, whether from the same thread that's using a partitioner or from a separate + thread. + + + + + + Creates an orderable partitioner from an + instance. + + Type of the elements in source list. + The list to be partitioned. + + A Boolean value that indicates whether the created partitioner should dynamically + load balance between partitions rather than statically partition. + + + An orderable partitioner based on the input list. + + + + + Creates an orderable partitioner from a instance. + + Type of the elements in source array. + The array to be partitioned. + + A Boolean value that indicates whether the created partitioner should dynamically load balance + between partitions rather than statically partition. + + + An orderable partitioner based on the input array. + + + + + Creates an orderable partitioner from a instance. + + Type of the elements in source enumerable. + The enumerable to be partitioned. + + An orderable partitioner based on the input array. + + + The ordering used in the created partitioner is determined by the natural order of the elements + as retrieved from the source enumerable. + + + + + DynamicPartitionEnumerator_Abstract defines the enumerator for each partition for the dynamic load-balance + partitioning algorithm. + - Partition is an enumerator of KeyValuePairs, each corresponding to an item in the data source: + the key is the index in the source collection; the value is the item itself. + - a set of such partitions share a reader over data source. The type of the reader is specified by + TSourceReader. + - each partition requests a contiguous chunk of elements at a time from the source data. The chunk + size is initially 1, and doubles every time until it reaches the maximum chunk size. + The implementation for GrabNextChunk() method has two versions: one for data source of IndexRange + types (IList and the array), one for data source of IEnumerable. + - The method "Reset" is not supported for any partitioning algorithm. + - The implementation for MoveNext() method is same for all dynanmic partitioners, so we provide it + in this abstract class. + + Type of the elements in the data source + Type of the reader on the data source + + + + Abstract method to request a contiguous chunk of elements from the source collection + + specified number of elements requested + + true if we successfully reserved at least one element (up to #=requestedChunkSize) + false if all elements in the source collection have been reserved. + + + + + Dispose is abstract, and depends on the type of the source data: + - For source data type IList and Array, the type of the shared reader is just the dataitself. + We don't do anything in Dispose method for IList and Array. + - For source data type IEnumerable, the type of the shared reader is an enumerator we created. + Thus we need to dispose this shared reader enumerator, when there is no more active partitions + left. + + + + + Reset on partitions is not supported + + + + + Moves to the next element if any. + Try current chunk first, if the current chunk do not have any elements left, then we + attempt to grab a chunk from the source collection. + + + true if successfully moving to the next position; + false otherwise, if and only if there is no more elements left in the current chunk + AND the source collection is exhausted. + + + + + Abstract property, returns whether or not the shared reader has already read the last + element of the source data + + + + + Get the current element in the current partition. Property required by IEnumerator interface + This property is abstract because the implementation is different depending on the type + of the source data: IList, Array or IEnumerable + + + + + Get the current element in the current partition. Property required by IEnumerator interface + + + + + Inherits from DynamicPartitioners + Provides customized implementation of GetOrderableDynamicPartitions_Factory method, to return an instance + of EnumerableOfPartitionsForIEnumerator defined internally + + Type of elements in the source data + + + + Overrides OrderablePartitioner.GetOrderablePartitions. + Partitions the underlying collection into the given number of orderable partitions. + + number of partitions requested + A list containing enumerators. + + + + Overrides OrderablePartitioner.GetOrderableDyanmicPartitions + + a enumerable collection of orderable partitions + + + + Whether additional partitions can be created dynamically. + + + + + Provides customized implementation for source data of IEnumerable + Different from the counterpart for IList/Array, this enumerable maintains several additional fields + shared by the partitions it owns, including a boolean "m_hasNoElementsLef", a shared lock, and a + shared count "m_activePartitionCount" + + + + + Inherits from DynamicPartitionEnumerator_Abstract directly + Provides customized implementation for: GrabNextChunk, HasNoElementsLeft, Current, Dispose + + + + + Reserves a contiguous range of elements from source data + + specified number of elements requested + + true if we successfully reserved at least one element (up to #=requestedChunkSize) + false if all elements in the source collection have been reserved. + + + + + If the current partition is to be disposed, we decrement the number of active partitions + for the shared reader. + If the number of active partitions becomes 0, we need to dispose the shared reader we created + + + + + Returns whether or not the shared reader has already read the last + element of the source data + + + We cannot call m_sharedReader.MoveNext(), to see if it hits the last element + or not, because we can't undo MoveNext(). Thus we need to maintain a shared + boolean value m_hasNoElementsLeft across all partitions + + + + + Dynamic load-balance partitioner. This class is abstract and to be derived from by + the customized partitioner classes for IList, Array, and IEnumerable + + Type of the elements in the source data + Type of the source data collection + + + + Constructs a new orderable partitioner + + source data collection + + + + Partition the source data and create an enumerable over the resulting partitions. + + the source data collection + an enumerable of partitions of + + + + Overrides OrderablePartitioner.GetOrderablePartitions. + Partitions the underlying collection into the given number of orderable partitions. + + number of partitions requested + A list containing enumerators. + + + + Overrides OrderablePartitioner.GetOrderableDyanmicPartitions + + a enumerable collection of orderable partitions + + + + Whether additional partitions can be created dynamically. + + + + + Defines dynamic partition for source data of IList and Array. + This class inherits DynamicPartitionEnumerator_Abstract + - implements GrabNextChunk, HasNoElementsLeft, and Dispose methods for IList and Array + - Current property still remains abstract, implementation is different for IList and Array + - introduces another abstract method SourceCount, which returns the number of elements in + the source data. Implementation differs for IList and Array + + Type of the elements in the data source + Type of the reader on the source data + + + + Reserves a contiguous range of elements from source data + + specified number of elements requested + + true if we successfully reserved at least one element (up to #=requestedChunkSize) + false if all elements in the source collection have been reserved. + + + + + For source data type IList and Array, the type of the shared reader is just the data itself. + We don't do anything in Dispose method for IList and Array. + + + + + Get the number of elements from the source reader. + It calls IList.Count or Array.Length + + + + + Returns whether or not the shared reader has already read the last + element of the source data + + + + + Inherits from DynamicPartitioners + Provides customized implementation of GetOrderableDynamicPartitions_Factory method, to return an instance + of EnumerableOfPartitionsForIList defined internally + + Type of elements in the source data + + + + Inherits from PartitionList_Abstract + Provides customized implementation for source data of IList + + + + + Inherits from DynamicPartitionEnumeratorForIndexRange_Abstract + Provides customized implementation of SourceCount property and Current property for IList + + + + + return a KeyValuePair of the current element and its key + + + + + Inherits from DynamicPartitioners + Provides customized implementation of GetOrderableDynamicPartitions_Factory method, to return an instance + of EnumerableOfPartitionsForArray defined internally + + Type of elements in the source data + + + + Inherits from PartitionList_Abstract + Provides customized implementation for source data of Array + + + + + Inherits from DynamicPartitionEnumeratorForIndexRange_Abstract + Provides customized implementation of SourceCount property and Current property for Array + + + + + Static partitioning over IList. + - dynamic and load-balance + - Keys are ordered within each partition + - Keys are ordered across partitions + - Keys are normalized + - Number of partitions is fixed once specified, and the elements of the source data are + distributed to each partition as evenly as possible. + + type of the elements + Type of the source data collection + + + + Abstract method to create a partition that covers a range over source data, + starting from "startIndex", ending at "endIndex" + + start index of the current partition on the source data + end index of the current partition on the source data + a partition enumerator over the specified range + + + + Overrides OrderablePartitioner.GetOrderablePartitions + Return a list of partitions, each of which enumerate a fixed part of the source data + The elements of the source data are distributed to each partition as evenly as possible. + Specifically, if the total number of elements is N, and number of partitions is x, and N = a*x +b, + where a is the quotient, and b is the remainder. Then the first b partitions each has a + 1 elements, + and the last x-b partitions each has a elements. + For example, if N=10, x =3, then + partition 0 ranges [0,3], + partition 1 ranges [4,6], + partition 2 ranges [7,9]. + This also takes care of the situation of (x>N), the last x-N partitions are empty enumerators. + An empty enumerator is indicated by + (m_startIndex == list.Count && m_endIndex == list.Count -1) + + specified number of partitions + a list of partitions + + + + Abstract method to return the number of elements in the source data + + + + + Static Partition for IList/Array. + This class implements all methods required by IEnumerator interface, except for the Current property. + Current Property is different for IList and Array. Arrays calls 'ldelem' instructions for faster element + retrieval. + + + + + Constructs an instance of StaticIndexRangePartition + + the start index in the source collection for the current partition + the end index in the source collection for the current partition + + + + We don't dispose the source for IList and array + + + + + Moves to the next item + Before the first MoveNext is called: m_offset == m_startIndex-1; + + true if successful, false if there is no item left + + + + Current Property is different for IList and Array. Arrays calls 'ldelem' instructions for faster + element retrieval. + + + + + Inherits from StaticIndexRangePartitioner + Provides customized implementation of SourceCount and CreatePartition + + + + + + Inherits from StaticIndexRangePartition + Provides customized implementation of Current property + + + + + + Inherits from StaticIndexRangePartitioner + Provides customized implementation of SourceCount and CreatePartition for Array + + + + + Inherits from StaticIndexRangePartitioner + Provides customized implementation of SourceCount and CreatePartition + + + + + A very simple primitive that allows us to share a value across multiple threads. + + + + + Represents one or more errors that occur during application execution. + + is used to consolidate multiple failures into a single, throwable + exception object. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with + a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class with a specified error + message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception. + The argument + is null. + + + + Initializes a new instance of the class with + references to the inner exceptions that are the cause of this exception. + + The exceptions that are the cause of the current exception. + The argument + is null. + An element of is + null. + + + + Initializes a new instance of the class with + references to the inner exceptions that are the cause of this exception. + + The exceptions that are the cause of the current exception. + The argument + is null. + An element of is + null. + + + + Initializes a new instance of the class with a specified error + message and references to the inner exceptions that are the cause of this exception. + + The error message that explains the reason for the exception. + The exceptions that are the cause of the current exception. + The argument + is null. + An element of is + null. + + + + Initializes a new instance of the class with a specified error + message and references to the inner exceptions that are the cause of this exception. + + The error message that explains the reason for the exception. + The exceptions that are the cause of the current exception. + The argument + is null. + An element of is + null. + + + + Allocates a new aggregate exception with the specified message and list of inner exceptions. + + The error message that explains the reason for the exception. + The exceptions that are the cause of the current exception. + The argument + is null. + An element of is + null. + + + + Initializes a new instance of the class with serialized data. + + The that holds + the serialized object data about the exception being thrown. + The that + contains contextual information about the source or destination. + The argument is null. + The exception could not be deserialized correctly. + + + + Sets the with information about + the exception. + + The that holds + the serialized object data about the exception being thrown. + The that + contains contextual information about the source or destination. + The argument is null. + + + + Returns the that is the root cause of this exception. + + + + + Invokes a handler on each contained by this . + + The predicate to execute for each exception. The predicate accepts as an + argument the to be processed and returns a Boolean to indicate + whether the exception was handled. + + Each invocation of the returns true or false to indicate whether the + was handled. After all invocations, if any exceptions went + unhandled, all unhandled exceptions will be put into a new + which will be thrown. Otherwise, the method simply returns. If any + invocations of the throws an exception, it will halt the processing + of any more exceptions and immediately propagate the thrown exception as-is. + + An exception contained by this was not handled. + The argument is + null. + + + + Flattens an instances into a single, new instance. + + A new, flattened . + + If any inner exceptions are themselves instances of + , this method will recursively flatten all of them. The + inner exceptions returned in the new + will be the union of all of the the inner exceptions from exception tree rooted at the provided + instance. + + + + + Creates and returns a string representation of the current . + + A string representation of the current exception. + + + + Gets a read-only collection of the instances that caused the + current exception. + + + + + Encapsulates a method that has five parameters and returns a value of the type specified by the TResult parameter. + + + + + Propogates notification that operations should be canceled. + + + + A may be created directly in an unchangeable canceled or non-canceled state + using the CancellationToken's constructors. However, to have a CancellationToken that can change + from a non-canceled to a canceled state, + CancellationTokenSource must be used. + CancellationTokenSource exposes the associated CancellationToken that may be canceled by the source through its + Token property. + + + Once canceled, a token may not transition to a non-canceled state, and a token whose + is false will never change to one that can be canceled. + + + All members of this struct are thread-safe and may be used concurrently from multiple threads. + + + + + + Internal constructor only a CancellationTokenSource should create a CancellationToken + + + + + Initializes the CancellationToken. + + + The canceled state for the token. + + + Tokens created with this constructor will remain in the canceled state specified + by the parameter. If is false, + both and will be false. + If is true, + both and will be true. + + + + + Registers a delegate that will be called when this CancellationToken is canceled. + + + + If this token is already in the canceled state, the + delegate will be run immediately and synchronously. Any exception the delegate generates will be + propogated out of this method call. + + + The current ExecutionContext, if one exists, will be captured + along with the delegate and will be used when executing it. + + + The delegate to be executed when the CancellationToken is canceled. + The instance that can + be used to deregister the callback. + is null. + The associated CancellationTokenSource has been disposed. + + + + Registers a delegate that will be called when this + CancellationToken is canceled. + + + + If this token is already in the canceled state, the + delegate will be run immediately and synchronously. Any exception the delegate generates will be + propogated out of this method call. + + + The current ExecutionContext, if one exists, will be captured + along with the delegate and will be used when executing it. + + + The delegate to be executed when the CancellationToken is canceled. + A Boolean value that indicates whether to capture + the current SynchronizationContext and use it + when invoking the . + The instance that can + be used to deregister the callback. + is null. + The associated CancellationTokenSource has been disposed. + + + + Registers a delegate that will be called when this + CancellationToken is canceled. + + + + If this token is already in the canceled state, the + delegate will be run immediately and synchronously. Any exception the delegate generates will be + propogated out of this method call. + + + The current ExecutionContext, if one exists, will be captured + along with the delegate and will be used when executing it. + + + The delegate to be executed when the CancellationToken is canceled. + The state to pass to the when the delegate is invoked. This may be null. + The instance that can + be used to deregister the callback. + is null. + The associated CancellationTokenSource has been disposed. + + + + Registers a delegate that will be called when this + CancellationToken is canceled. + + + + If this token is already in the canceled state, the + delegate will be run immediately and synchronously. Any exception the delegate generates will be + propogated out of this method call. + + + The current ExecutionContext, if one exists, + will be captured along with the delegate and will be used when executing it. + + + The delegate to be executed when the CancellationToken is canceled. + The state to pass to the when the delegate is invoked. This may be null. + A Boolean value that indicates whether to capture + the current SynchronizationContext and use it + when invoking the . + The instance that can + be used to deregister the callback. + is null. + The associated CancellationTokenSource has been disposed. + + + + Determines whether the current CancellationToken instance is equal to the + specified token. + + The other CancellationToken to which to compare this + instance. + True if the instances are equal; otherwise, false. Two tokens are equal if they are associated + with the same CancellationTokenSource or if they were both constructed + from public CancellationToken constructors and their values are equal. + + + + Determines whether the current CancellationToken instance is equal to the + specified . + + The other object to which to compare this instance. + True if is a CancellationToken + and if the two instances are equal; otherwise, false. Two tokens are equal if they are associated + with the same CancellationTokenSource or if they were both constructed + from public CancellationToken constructors and their values are equal. + An associated CancellationTokenSource has been disposed. + + + + Serves as a hash function for a CancellationToken. + + A hash code for the current CancellationToken instance. + + + + Determines whether two CancellationToken instances are equal. + + The first instance. + The second instance. + True if the instances are equal; otherwise, false. + An associated CancellationTokenSource has been disposed. + + + + Determines whether two CancellationToken instances are not equal. + + The first instance. + The second instance. + True if the instances are not equal; otherwise, false. + An associated CancellationTokenSource has been disposed. + + + + Throws a OperationCanceledException if + this token has had cancellation requested. + + + This method provides functionality equivalent to: + + if (token.IsCancellationRequested) + throw new OperationCanceledException(token); + + + The token has had cancellation requested. + The associated CancellationTokenSource has been disposed. + + + + Returns an empty CancellationToken value. + + + The value returned by this property will be non-cancelable by default. + + + + + Gets whether cancellation has been requested for this token. + + Whether cancellation has been requested for this token. + + + This property indicates whether cancellation has been requested for this token, + either through the token initially being construted in a canceled state, or through + calling Cancel + on the token's associated . + + + If this property is true, it only guarantees that cancellation has been requested. + It does not guarantee that every registered handler + has finished executing, nor that cancellation requests have finished propagating + to all registered handlers. Additional synchronization may be required, + particularly in situations where related objects are being canceled concurrently. + + + + + + Gets whether this token is capable of being in the canceled state. + + + If CanBeCanceled returns false, it is guaranteed that the token will never transition + into a canceled state, meaning that will never + return true. + + + + + Gets a that is signaled when the token is canceled. + + Accessing this property causes a WaitHandle + to be instantiated. It is preferable to only use this property when necessary, and to then + dispose the associated instance at the earliest opportunity (disposing + the source will dispose of this allocated handle). The handle should not be closed or disposed directly. + + The associated CancellationTokenSource has been disposed. + + + + Represents a callback delegate that has been registered with a CancellationToken. + + + To unregister a callback, dispose the corresponding Registration instance. + + + + + Attempts to deregister the item. If it's already being run, this may fail. + Entails a full memory fence. + + True if the callback was found and deregistered, false otherwise. + + + + Disposes of the registration and unregisters the target callback from the associated + CancellationToken. + If the target callback is currently executing this method will wait until it completes, except + in the degenerate cases where a callback method deregisters itself. + + + + + Determines whether two CancellationTokenRegistration + instances are equal. + + The first instance. + The second instance. + True if the instances are equal; otherwise, false. + + + + Determines whether two CancellationTokenRegistration instances are not equal. + + The first instance. + The second instance. + True if the instances are not equal; otherwise, false. + + + + Determines whether the current CancellationTokenRegistration instance is equal to the + specified . + + The other object to which to compare this instance. + True, if both this and are equal. False, otherwise. + Two CancellationTokenRegistration instances are equal if + they both refer to the output of a single call to the same Register method of a + CancellationToken. + + + + + Determines whether the current CancellationToken instance is equal to the + specified . + + The other CancellationTokenRegistration to which to compare this instance. + True, if both this and are equal. False, otherwise. + Two CancellationTokenRegistration instances are equal if + they both refer to the output of a single call to the same Register method of a + CancellationToken. + + + + + Serves as a hash function for a CancellationTokenRegistration.. + + A hash code for the current CancellationTokenRegistration instance. + + + + Signals to a that it should be canceled. + + + + is used to instantiate a + (via the source's Token property) + that can be handed to operations that wish to be notified of cancellation or that can be used to + register asynchronous operations for cancellation. That token may have cancellation requested by + calling to the source's Cancel + method. + + + All members of this class, except Dispose, are thread-safe and may be used + concurrently from multiple threads. + + + + + The ID of the thread currently executing the main body of CTS.Cancel() + this helps us to know if a call to ctr.Dispose() is running 'within' a cancellation callback. + This is updated as we move between the main thread calling cts.Cancel() and any syncContexts that are used to + actually run the callbacks. + + + + Initializes the . + + + + + Communicates a request for cancellation. + + + + The associated will be + notified of the cancellation and will transition to a state where + IsCancellationRequested returns true. + Any callbacks or cancelable operations + registered with the will be executed. + + + Cancelable operations and callbacks registered with the token should not throw exceptions. + However, this overload of Cancel will aggregate any exceptions thrown into a , + such that one callback throwing an exception will not prevent other registered callbacks from being executed. + + + The that was captured when each callback was registered + will be reestablished when the callback is invoked. + + + An aggregate exception containing all the exceptions thrown + by the registered callbacks on the associated . + This has been disposed. + + + + Communicates a request for cancellation. + + + + The associated will be + notified of the cancellation and will transition to a state where + IsCancellationRequested returns true. + Any callbacks or cancelable operations + registered with the will be executed. + + + Cancelable operations and callbacks registered with the token should not throw exceptions. + If is true, an exception will immediately propagate out of the + call to Cancel, preventing the remaining callbacks and cancelable operations from being processed. + If is false, this overload will aggregate any + exceptions thrown into a , + such that one callback throwing an exception will not prevent other registered callbacks from being executed. + + + The that was captured when each callback was registered + will be reestablished when the callback is invoked. + + + Specifies whether exceptions should immediately propagate. + An aggregate exception containing all the exceptions thrown + by the registered callbacks on the associated . + This has been disposed. + + + + Releases the resources used by this . + + + This method is not thread-safe for any other concurrent calls. + + + + + Throws an exception if the source has been disposed. + + + + + InternalGetStaticSource() + + Whether the source should be set. + A static source to be shared among multiple tokens. + + + + Registers a callback object. If cancellation has already occurred, the + callback will have been run by the time this method returns. + + + + + + + + + + Invoke the Canceled event. + + + The handlers are invoked synchronously in LIFO order. + + + + + Creates a CancellationTokenSource that will be in the canceled state + when any of the source tokens are in the canceled state. + + The first CancellationToken to observe. + The second CancellationToken to observe. + A CancellationTokenSource that is linked + to the source tokens. + A CancellationTokenSource associated with + one of the source tokens has been disposed. + + + + Creates a CancellationTokenSource that will be in the canceled state + when any of the source tokens are in the canceled state. + + The CancellationToken instances to observe. + A CancellationTokenSource that is linked + to the source tokens. + is null. + A CancellationTokenSource associated with + one of the source tokens has been disposed. + + + + Gets whether cancellation has been requested for this CancellationTokenSource. + + Whether cancellation has been requested for this CancellationTokenSource. + + + This property indicates whether cancellation has been requested for this token source, such as + due to a call to its + Cancel method. + + + If this property returns true, it only guarantees that cancellation has been requested. It does not + guarantee that every handler registered with the corresponding token has finished executing, nor + that cancellation requests have finished propagating to all registered handlers. Additional + synchronization may be required, particularly in situations where related objects are being + canceled concurrently. + + + + + + A simple helper to determine whether cancellation has finished. + + + + + A simple helper to determine whether disposal has occured. + + + + + The ID of the thread that is running callbacks. + + + + + Gets the CancellationToken + associated with this . + + The CancellationToken + associated with this . + The token source has been + disposed. + + + + + + + + + + + + + + The currently executing callback + + + + + A helper class for collating the various bits of information required to execute + cancellation callbacks. + + + + + InternalExecuteCallbackSynchronously_GeneralPath + This will be called on the target synchronization context, however, we still need to restore the required execution context + + + + + A sparsely populated array. Elements can be sparse and some null, but this allows for + lock-free additions and growth, and also for constant time removal (by nulling out). + + The kind of elements contained within. + + + + Allocates a new array with the given initial size. + + How many array slots to pre-allocate. + + + + Adds an element in the first available slot, beginning the search from the tail-to-head. + If no slots are available, the array is grown. The method doesn't return until successful. + + The element to add. + Information about where the add happened, to enable O(1) deregistration. + + + + The head of the doubly linked list. + + + + + The tail of the doubly linked list. + + + + + A struct to hold a link to the exact spot in an array an element was inserted, enabling + constant time removal later on. + + + + + A fragment of a sparsely populated array, doubly linked. + + The kind of elements contained within. + + + + Represents a synchronization primitive that is signaled when its count reaches zero. + + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads, with the exception of Dispose, which + must only be used when all other operations on the have + completed, and Reset, which should only be used when no other threads are + accessing the event. + + + + + Initializes a new instance of class with the + specified count. + + The number of signals required to set the . + is less + than 0. + + + + Releases all resources used by the current instance of . + + + Unlike most of the members of , is not + thread-safe and may not be used concurrently with other members of this instance. + + + + + When overridden in a derived class, releases the unmanaged resources used by the + , and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release + only unmanaged resources. + + Unlike most of the members of , is not + thread-safe and may not be used concurrently with other members of this instance. + + + + + Registers a signal with the , decrementing its + count. + + true if the signal caused the count to reach zero and the event was set; otherwise, + false. + The current instance is already set. + + The current instance has already been + disposed. + + + + Registers multiple signals with the , + decrementing its count by the specified amount. + + The number of signals to register. + true if the signals caused the count to reach zero and the event was set; otherwise, + false. + + The current instance is already set. -or- Or is greater than . + + is less + than 1. + The current instance has already been + disposed. + + + + Increments the 's current count by one. + + The current instance is already + set. + is equal to . + + The current instance has already been disposed. + + + + + Attempts to increment the 's current count by one. + + true if the increment succeeded; otherwise, false. If is + already at zero. this will return false. + is equal to . + The current instance has already been + disposed. + + + + Increments the 's current count by a specified + value. + + The value by which to increase . + is less than + 0. + The current instance is already + set. + is equal to . + The current instance has already been + disposed. + + + + Attempts to increment the 's current count by a + specified value. + + The value by which to increase . + true if the increment succeeded; otherwise, false. If is + already at zero this will return false. + is less + than 0. + The current instance is already + set. + is equal to . + The current instance has already been + disposed. + + + + Resets the to the value of . + + + Unlike most of the members of , Reset is not + thread-safe and may not be used concurrently with other members of this instance. + + The current instance has already been + disposed.. + + + + Resets the to a specified value. + + The number of signals required to set the . + + Unlike most of the members of , Reset is not + thread-safe and may not be used concurrently with other members of this instance. + + is + less than 0. + The current instance has alread been disposed. + + + + Blocks the current thread until the is set. + + + The caller of this method blocks indefinitely until the current instance is set. The caller will + return immediately if the event is currently in a set state. + + The current instance has already been + disposed. + + + + Blocks the current thread until the is set, while + observing a . + + The to + observe. + + The caller of this method blocks indefinitely until the current instance is set. The caller will + return immediately if the event is currently in a set state. If the + CancellationToken being observed + is canceled during the wait operation, an + will be thrown. + + has been + canceled. + The current instance has already been + disposed. + + + + Blocks the current thread until the is set, using a + to measure the time interval. + + A that represents the number of + milliseconds to wait, or a that represents -1 milliseconds to + wait indefinitely. + true if the was set; otherwise, + false. + is a negative + number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater + than . + The current instance has already been + disposed. + + + + Blocks the current thread until the is set, using + a to measure the time interval, while observing a + . + + A that represents the number of + milliseconds to wait, or a that represents -1 milliseconds to + wait indefinitely. + The to + observe. + true if the was set; otherwise, + false. + is a negative + number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater + than . + The current instance has already been + disposed. + has + been canceled. + + + + Blocks the current thread until the is set, using a + 32-bit signed integer to measure the time interval. + + The number of milliseconds to wait, or (-1) to wait indefinitely. + true if the was set; otherwise, + false. + is a + negative number other than -1, which represents an infinite time-out. + The current instance has already been + disposed. + + + + Blocks the current thread until the is set, using a + 32-bit signed integer to measure the time interval, while observing a + . + + The number of milliseconds to wait, or (-1) to wait indefinitely. + The to + observe. + true if the was set; otherwise, + false. + is a + negative number other than -1, which represents an infinite time-out. + The current instance has already been + disposed. + has + been canceled. + + + + Throws an exception if the latch has been disposed. + + + + + Gets the number of remaining signals required to set the event. + + + The number of remaining signals required to set the event. + + + + + Gets the numbers of signals initially required to set the event. + + + The number of signals initially required to set the event. + + + + + Determines whether the event is set. + + true if the event is set; otherwise, false. + + + + Gets a that is used to wait for the event to be set. + + A that is used to wait for the event to be set. + The current instance has already been disposed. + + should only be used if it's needed for integration with code bases + that rely on having a WaitHandle. If all that's needed is to wait for the + to be set, the method should be preferred. + + + + + Provides a slimmed down version of . + + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads, with the exception of Dispose, which + must only be used when all other operations on the have + completed, and Reset, which should only be used when no other threads are + accessing the event. + + + + + Initializes a new instance of the + class with an initial state of nonsignaled. + + + + + Initializes a new instance of the + class with a Boolen value indicating whether to set the intial state to signaled. + + true to set the initial state signaled; false to set the initial state + to nonsignaled. + + + + Initializes a new instance of the + class with a Boolen value indicating whether to set the intial state to signaled and a specified + spin count. + + true to set the initial state to signaled; false to set the initial state + to nonsignaled. + The number of spin waits that will occur before falling back to a true + wait. + is less than + 0 or greater than the maximum allowed value. + + + + Initializes the internal state of the event. + + Whether the event is set initially or not. + The spin count that decides when the event will block. + + + + Helper to ensure the lock object is created before first use. + + + + + This method lazily initializes the event object. It uses CAS to guarantee that + many threads racing to call this at once don't result in more than one event + being stored and used. The event will be signaled or unsignaled depending on + the state of the thin-event itself, with synchronization taken into account. + + True if a new event was created and stored, false otherwise. + + + + Sets the state of the event to signaled, which allows one or more threads waiting on the event to + proceed. + + + + + Private helper to actually perform the Set. + + Indicates whether we are calling Set() during cancellation. + The object has been canceled. + + + + Sets the state of the event to nonsignaled, which causes threads to block. + + + Unlike most of the members of , is not + thread-safe and may not be used concurrently with other members of this instance. + + + + + Blocks the current thread until the current is set. + + + The maximum number of waiters has been exceeded. + + + The caller of this method blocks indefinitely until the current instance is set. The caller will + return immediately if the event is currently in a set state. + + + + + Blocks the current thread until the current receives a signal, + while observing a . + + The to + observe. + + The maximum number of waiters has been exceeded. + + was + canceled. + + The caller of this method blocks indefinitely until the current instance is set. The caller will + return immediately if the event is currently in a set state. + + + + + Blocks the current thread until the current is set, using a + to measure the time interval. + + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + true if the was set; otherwise, + false. + is a negative + number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater + than . + + The maximum number of waiters has been exceeded. + + + + + Blocks the current thread until the current is set, using a + to measure the time interval, while observing a . + + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + The to + observe. + true if the was set; otherwise, + false. + is a negative + number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater + than . + was canceled. + + The maximum number of waiters has been exceeded. + + + + + Blocks the current thread until the current is set, using a + 32-bit signed integer to measure the time interval. + + The number of milliseconds to wait, or (-1) to wait indefinitely. + true if the was set; otherwise, + false. + is a + negative number other than -1, which represents an infinite time-out. + + The maximum number of waiters has been exceeded. + + + + + Blocks the current thread until the current is set, using a + 32-bit signed integer to measure the time interval, while observing a . + + The number of milliseconds to wait, or (-1) to wait indefinitely. + The to + observe. + true if the was set; otherwise, + false. + is a + negative number other than -1, which represents an infinite time-out. + + The maximum number of waiters has been exceeded. + + was canceled. + + + + Releases all resources used by the current instance of . + + + Unlike most of the members of , is not + thread-safe and may not be used concurrently with other members of this instance. + + + + + When overridden in a derived class, releases the unmanaged resources used by the + , and optionally releases the managed resources. + + true to release both managed and unmanaged resources; + false to release only unmanaged resources. + + Unlike most of the members of , is not + thread-safe and may not be used concurrently with other members of this instance. + + + + + Throw ObjectDisposedException if the MRES is disposed + + + + + Private helper method to wake up waiters when a cancellationToken gets canceled. + + + + + Private helper method for updating parts of a bit-string state value. + Mainly called from the IsSet and Waiters properties setters + + + Note: the parameter types must be int as CompareExchange cannot take a Uint + + The new value + The mask used to set the bits + + + + Private helper method - performs Mask and shift, particular helpful to extract a field from a packed word. + eg ExtractStatePortionAndShiftRight(0x12345678, 0xFF000000, 24) => 0x12, ie extracting the top 8-bits as a simple integer + + ?? is there a common place to put this rather than being private to MRES? + + + + + + + + + Performs a Mask operation, but does not perform the shift. + This is acceptable for boolean values for which the shift is unnecessary + eg (val & Mask) != 0 is an appropriate way to extract a boolean rather than using + ((val & Mask) >> shiftAmount) == 1 + + ?? is there a common place to put this rather than being private to MRES? + + + + + + + Helper function to measure and update the wait time + + The first time (in Ticks) observed when the wait started. + The orginal wait timeoutout in milliseconds. + The new wait time in milliseconds, -1 if the time expired, -2 if overflow in counters + has occurred. + + + + Gets the underlying object for this . + + The underlying event object fore this . + + Accessing this property forces initialization of an underlying event object if one hasn't + already been created. To simply wait on this , + the public Wait methods should be preferred. + + + + + Gets whether the event is set. + + true if the event has is set; otherwise, false. + + + + Gets the number of spin waits that will be occur before falling back to a true wait. + + + + + How many threads are waiting. + + + + + Provides support for lazy initialization. + + Specifies the type of element being laziliy initialized. + + + By default, all public and protected members of are thread-safe and may be used + concurrently from multiple threads. These thread-safety guarantees may be removed optionally and per instance + using parameters to the type's constructors. + + + + + + Initializes a new instance of the class that + uses 's default constructor for lazy initialization. + + + An instance created with this constructor may be used concurrently from multiple threads. + + + + + Initializes a new instance of the class that uses a + specified initialization function. + + + The invoked to produce the lazily-initialized value when it is + needed. + + is a null + reference (Nothing in Visual Basic). + + An instance created with this constructor may be used concurrently from multiple threads. + + + + + Initializes a new instance of the + class that uses 's default constructor and a specified thread-safety mode. + + true if this instance should be usable by multiple threads concurrently; false if the instance will only be used by one thread at a time. + + + + + Initializes a new instance of the + class that uses 's default constructor and a specified thread-safety mode. + + The lazy thread-safety mode mode + mode contains an invalid valuee + + + + Initializes a new instance of the class + that uses a specified initialization function and a specified thread-safety mode. + + + The invoked to produce the lazily-initialized value when it is needed. + + true if this instance should be usable by multiple threads concurrently; false if the instance will only be used by one thread at a time. + + is + a null reference (Nothing in Visual Basic). + + + + Initializes a new instance of the class + that uses a specified initialization function and a specified thread-safety mode. + + + The invoked to produce the lazily-initialized value when it is needed. + + The lazy thread-safety mode. + is + a null reference (Nothing in Visual Basic). + mode contains an invalid value. + + + + Static helper function that returns an object based on the given mode. it also throws an exception if the mode is invalid + + + + Forces initialization during serialization. + The StreamingContext for the serialization operation. + + + Creates and returns a string representation of this instance. + The result of calling on the . + + The is null. + + + + + local helper method to initialize the value + + The inititialized T value + + + Creates an instance of T using m_valueFactory in case its not null or use reflection to create a new T() + An instance of Boxed. + + + Gets the value of the Lazy<T> for debugging display purposes. + + + + Gets a value indicating whether this instance may be used concurrently from multiple threads. + + + + + Gets whether the value creation is faulted or not + + + + Gets a value indicating whether the has been initialized. + + true if the instance has been initialized; + otherwise, false. + + The initialization of a instance may result in either + a value being produced or an exception being thrown. If an exception goes unhandled during initialization, + will return false. + + + + + + wrapper class to box the initialized value, this is mainly created to avoid boxing/unboxing the value each time the value is called in case T is + a value type + + + + + Wrapper class to wrap the excpetion thrown by the value factory + + + + A debugger view of the Lazy<T> to surface additional debugging properties and + to ensure that the Lazy<T> does not become initialized if it was not already. + + + Constructs a new debugger view object for the provided Lazy object. + A Lazy object to browse in the debugger. + + + Returns whether the Lazy object is initialized or not. + + + Returns the value of the Lazy object. + + + Returns the execution mode of the Lazy object + + + Returns the execution mode of the Lazy object + + + + Specifies how a instance should synchronize access among multiple threads. + + + + + This mode makes no guarantees around the thread-safety of the instance. If used from multiple threads, the behavior of the is undefined. + This mode should be used when a is guaranteed to never be initialized from more than one thread simultaneously and high performance is crucial. + If valueFactory throws an exception when the is initialized, the exception will be cached and returned on subsequent accesses to Value. Also, if valueFactory recursively + accesses Value on this instance, a will be thrown. + + + + + When multiple threads attempt to simultaneously initialize a instance, this mode allows each thread to execute the + valueFactory but only the first thread to complete initialization will be allowed to set the final value of the . + Once initialized successfully, any future calls to Value will return the cached result. If valueFactory throws an exception on any thread, that exception will be + propagated out of Value. If any thread executes valueFactory without throwing an exception and, therefore, successfully sets the value, that value will be returned on + subsequent accesses to Value from any thread. If no thread succeeds in setting the value, IsValueCreated will remain false and subsequent accesses to Value will result in + the valueFactory delegate re-executing. Also, if valueFactory recursively accesses Value on this instance, an exception will NOT be thrown. + + + + + This mode uses locks to ensure that only a single thread can initialize a instance in a thread-safe manner. In general, + taken if this mode is used in conjunction with a valueFactory delegate that uses locks internally, a deadlock can occur if not + handled carefully. If valueFactory throws an exception when the is initialized, the exception will be cached and returned on + subsequent accesses to Value. Also, if valueFactory recursively accesses Value on this instance, a will be thrown. + + + + + Provides lazy initialization routines. + + + These routines avoid needing to allocate a dedicated, lazy-initialization instance, instead using + references to ensure targets have been initialized as they are accessed. + + + + + Initializes a target reference type with the type's default constructor if the target has not + already been initialized. + + The refence type of the reference to be initialized. + A reference of type to initialize if it has not + already been initialized. + The initialized reference of type . + Type does not have a default + constructor. + + Permissions to access the constructor of type were missing. + + + + This method may only be used on reference types. To ensure initialization of value + types, see other overloads of EnsureInitialized. + + + This method may be used concurrently by multiple threads to initialize . + In the event that multiple threads access this method concurrently, multiple instances of + may be created, but only one will be stored into . In such an occurrence, this method will not dispose of the + objects that were not stored. If such objects must be disposed, it is up to the caller to determine + if an object was not used and to then dispose of the object appropriately. + + + + + + Initializes a target reference type using the specified function if it has not already been + initialized. + + The reference type of the reference to be initialized. + The reference of type to initialize if it has not + already been initialized. + The invoked to initialize the + reference. + The initialized reference of type . + Type does not have a + default constructor. + returned + null. + + + This method may only be used on reference types, and may + not return a null reference (Nothing in Visual Basic). To ensure initialization of value types or + to allow null reference types, see other overloads of EnsureInitialized. + + + This method may be used concurrently by multiple threads to initialize . + In the event that multiple threads access this method concurrently, multiple instances of + may be created, but only one will be stored into . In such an occurrence, this method will not dispose of the + objects that were not stored. If such objects must be disposed, it is up to the caller to determine + if an object was not used and to then dispose of the object appropriately. + + + + + + Initialize the target using the given delegate (slow path). + + The reference type of the reference to be initialized. + The variable that need to be initialized + The delegate that will be executed to initialize the target + The initialized variable + + + + Initializes a target reference or value type with its default constructor if it has not already + been initialized. + + The type of the reference to be initialized. + A reference or value of type to initialize if it + has not already been initialized. + A reference to a boolean that determines whether the target has already + been initialized. + A reference to an object used as the mutually exclusive lock for initializing + . + The initialized value of type . + + + + Initializes a target reference or value type with a specified function if it has not already been + initialized. + + The type of the reference to be initialized. + A reference or value of type to initialize if it + has not already been initialized. + A reference to a boolean that determines whether the target has already + been initialized. + A reference to an object used as the mutually exclusive lock for initializing + . + The invoked to initialize the + reference or value. + The initialized value of type . + + + + Ensure the target is initialized and return the value (slow path). This overload permits nulls + and also works for value type targets. Uses the supplied function to create the value. + + The type of target. + A reference to the target to be initialized. + A reference to a location tracking whether the target has been initialized. + A reference to a location containing a mutual exclusive lock. + + The to invoke in order to produce the lazily-initialized value. + + The initialized object. + + + + A seprate non generic class that contains a global counter for fast path instances for all Ts that has been created, and adds an upper limit for all instances + that uses the fast path, if this limit has been reached, all new instances will use the slow path + + + + + Provides thread-local storage of data. + + Specifies the type of data stored per-thread. + + + With the exception of , all public and protected members of + are thread-safe and may be used + concurrently from multiple threads. + + + + + + Initializes the instance. + + + + + Initializes the instance with the + specified function. + + + The invoked to produce a lazily-initialized value when + an attempt is made to retrieve without it having been previously initialized. + + + is a null reference (Nothing in Visual Basic). + + + + + Releases the resources used by this instance. + + + + + Releases the resources used by this instance. + + + Unlike most of the members of , this method is not thread-safe. + + + + + Releases the resources used by this instance. + + + A Boolean value that indicates whether this method is being called due to a call to . + + + Unlike most of the members of , this method is not thread-safe. + + + + + Tries to get a unique index for the current instance of type T, it first tries to get it from the pool if it is not empty, otherwise it + increments the global counter if it is still below the maximum, otherwise it fails and returns -1 + + True if there is an index available, false otherwise + + + + Gets an array of types that will be used as generic parameters for the GenericHolder class + + The types array + + + Creates and returns a string representation of this instance for the current thread. + The result of calling on the . + + The for the current thread is a null reference (Nothing in Visual Basic). + + + The initialization function referenced in an improper manner. + + + The instance has been disposed. + + + Calling this method forces initialization for the current thread, as is the + case with accessing directly. + + + + + Private helper function to lazily create the value using the calueSelector if specified in the constructor or the default parameterless constructor + + Returns the boxed object + + + + Gets or sets the value of this instance for the current thread. + + + The initialization function referenced in an improper manner. + + + The instance has been disposed. + + + If this instance was not previously initialized for the current thread, + accessing will attempt to initialize it. If an initialization function was + supplied during the construction, that initialization will happen by invoking the function + to retrieve the initial value for . Otherwise, the default value of + will be used. + + + + + Gets whether is initialized on the current thread. + + + The instance has been disposed. + + + + Gets the value of the ThreadLocal<T> for debugging display purposes. It takes care of getting + the value for the current thread in the ThreadLocal mode. + + + + The base abstract class for the holder + + + + + The TLS holder representation + + + + + The generic holder representation + + Dummy param + Dummy param + Dummy param + + + + wrapper to the actual value + + + + A debugger view of the ThreadLocal<T> to surface additional debugging properties and + to ensure that the ThreadLocal<T> does not become initialized if it was not already. + + + Constructs a new debugger view object for the provided ThreadLocal object. + A ThreadLocal object to browse in the debugger. + + + Returns whether the ThreadLocal object is initialized or not. + + + Returns the value of the ThreadLocal object. + + + + Limits the number of threads that can access a resource or pool of resources concurrently. + + + + The provides a lightweight semaphore class that doesn't + use Windows kernel semaphores. + + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads, with the exception of Dispose, which + must only be used when all other operations on the have + completed. + + + + + + Initializes a new instance of the class, specifying + the initial number of requests that can be granted concurrently. + + The initial number of requests for the semaphore that can be granted + concurrently. + + is less than 0. + + + + Initializes a new instance of the class, specifying + the initial and maximum number of requests that can be granted concurrently. + + The initial number of requests for the semaphore that can be granted + concurrently. + The maximum number of requests for the semaphore that can be granted + concurrently. + + is less than 0. -or- + is greater than . -or- + is less than 0. + + + + Blocks the current thread until it can enter the . + + The current instance has already been + disposed. + + + + Blocks the current thread until it can enter the , while observing a + . + + The token to + observe. + was + canceled. + The current instance has already been + disposed. + + + + Blocks the current thread until it can enter the , using a to measure the time interval. + + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + true if the current thread successfully entered the ; + otherwise, false. + is a negative + number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater + than . + + + + Blocks the current thread until it can enter the , using a to measure the time interval, while observing a . + + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + The to + observe. + true if the current thread successfully entered the ; + otherwise, false. + is a negative + number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater + than . + was canceled. + + + + Blocks the current thread until it can enter the , using a 32-bit + signed integer to measure the time interval. + + The number of milliseconds to wait, or (-1) to wait indefinitely. + true if the current thread successfully entered the ; + otherwise, false. + is a + negative number other than -1, which represents an infinite time-out. + + + + Blocks the current thread until it can enter the , + using a 32-bit signed integer to measure the time interval, + while observing a . + + The number of milliseconds to wait, or (-1) to + wait indefinitely. + The to observe. + true if the current thread successfully entered the ; otherwise, false. + is a negative number other than -1, + which represents an infinite time-out. + was canceled. + + + + Local helper function, waits on the monitor until the monitor recieves signal or the + timeout is expired + + The maximum timeout + The start ticks to calculate the elapsed time + The CancellationToken to observe. + true if the monitor recieved a signal, false if the timeout expired + + + + Exits the once. + + The previous count of the . + The current instance has already been + disposed. + + + + Exits the a specified number of times. + + The number of times to exit the semaphore. + The previous count of the . + is less + than 1. + The has + already reached its maximum size. + The current instance has already been + disposed. + + + + Releases all resources used by the current instance of . + + + Unlike most of the members of , is not + thread-safe and may not be used concurrently with other members of this instance. + + + + + When overridden in a derived class, releases the unmanaged resources used by the + , and optionally releases the managed resources. + + true to release both managed and unmanaged resources; + false to release only unmanaged resources. + + Unlike most of the members of , is not + thread-safe and may not be used concurrently with other members of this instance. + + + + + Helper function to measure and update the wait time + + The first time (in Ticks) observed when the wait started + The orginal wait timeoutout in milliseconds + The new wait time in milliseconds, -1 if the time expired + + + + Private helper method to wake up waiters when a cancellationToken gets canceled. + + + + + Checks the dispose status by checking the lock object, if it is null means that object + has been disposed and throw ObjectDisposedException + + + + + local helper function to retrieve the exception string message from the resource file + + The key string + + + + Gets the current count of the . + + The current count of the . + + + + Returns a that can be used to wait on the semaphore. + + A that can be used to wait on the + semaphore. + + A successful wait on the does not imply a successful wait on + the itself, nor does it decrement the semaphore's + count. exists to allow a thread to block waiting on multiple + semaphores, but such a wait should be followed by a true wait on the target semaphore. + + The has been disposed. + + + + Provides support for spin-based waiting. + + + + encapsulates common spinning logic. On single-processor machines, yields are + always used instead of busy waits, and on computers with Intel™ processors employing Hyper-Threading™ + technology, it helps to prevent hardware thread starvation. SpinWait encapsulates a good mixture of + spinning and true yielding. + + + is a value type, which means that low-level code can utilize SpinWait without + fear of unnecessary allocation overheads. SpinWait is not generally useful for ordinary applications. + In most cases, you should use the synchronization classes provided by the .NET Framework, such as + . For most purposes where spin waiting is required, however, + the type should be preferred over the method. + + + While SpinWait is designed to be used in concurrent applications, it is not designed to be + used from multiple threads concurrently. SpinWait's members are not thread-safe. If multiple + threads must spin, each should use its own instance of SpinWait. + + + + + + Performs a single spin. + + + This is typically called in a loop, and may change in behavior based on the number of times a + has been called thus far on this instance. + + + + + Resets the spin counter. + + + This makes and behave as though no calls + to had been issued on this instance. If a instance + is reused many times, it may be useful to reset it to avoid yielding too soon. + + + + + Spins until the specified condition is satisfied. + + A delegate to be executed over and over until it returns true. + The argument is null. + + + + Spins until the specified condition is satisfied or until the specified timeout is expired. + + A delegate to be executed over and over until it returns true. + + A that represents the number of milliseconds to wait, + or a TimeSpan that represents -1 milliseconds to wait indefinitely. + True if the condition is satisfied within the timeout; otherwise, false + The argument is null. + is a negative number + other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater than + . + + + + Spins until the specified condition is satisfied or until the specified timeout is expired. + + A delegate to be executed over and over until it returns true. + The number of milliseconds to wait, or (-1) to wait indefinitely. + True if the condition is satisfied within the timeout; otherwise, false + The argument is null. + is a + negative number other than -1, which represents an infinite time-out. + + + + Gets the number of times has been called on this instance. + + + + + Gets whether the next call to will yield the processor, triggering a + forced context switch. + + Whether the next call to will yield the processor, triggering a + forced context switch. + + On a single-CPU machine, always yields the processor. On machines with + multiple CPUs, may yield after an unspecified number of calls. + + + + + A helper class to get the number of preocessors, it updates the numbers of processors every sampling interval + + + + + Gets the number of available processors + + + + + Gets whether the current machine has only a single processor. + + + + + Provides a mutual exclusion lock primitive where a thread trying to acquire the lock waits in a loop + repeatedly checking until the lock becomes available. + + + + Spin locks can be used for leaf-level locks where the object allocation implied by using a , in size or due to garbage collection pressure, is overly + expensive. Avoiding blocking is another reason that a spin lock can be useful, however if you expect + any significant amount of blocking, you are probably best not using spin locks due to excessive + spinning. Spinning can be beneficial when locks are fine grained and large in number (for example, a + lock per node in a linked list) as well as when lock hold times are always extremely short. In + general, while holding a spin lock, one should avoid blocking, calling anything that itself may + block, holding more than one spin lock at once, making dynamically dispatched calls (interface and + virtuals), making statically dispatched calls into any code one doesn't own, or allocating memory. + + + should only be used when it's been determined that doing so will improve an + application's performance. It's also important to note that is a value type, + for performance reasons. As such, one must be very careful not to accidentally copy a SpinLock + instance, as the two instances (the original and the copy) would then be completely independent of + one another, which would likely lead to erroneous behavior of the application. If a SpinLock instance + must be passed around, it should be passed by reference rather than by value. + + + Do not store instances in readonly fields. + + + All members of are thread-safe and may be used from multiple threads + concurrently. + + + + + + Initializes a new instance of the + structure with the option to track thread IDs to improve debugging. + + + The default constructor for tracks thread ownership. + + Whether to capture and use thread IDs for debugging + purposes. + + + + Initializes a new instance of the + structure with the option to track thread IDs to improve debugging. + + + The default constructor for tracks thread ownership. + + + Acquires the lock in a reliable manner, such that even if an exception occurs within the method + call, can be examined reliably to determine whether the lock was + acquired. + + + is a non-reentrant lock, meaning that if a thread holds the lock, it is + not allowed to enter the lock again. If thread ownership tracking is enabled (whether it's + enabled is available through ), an exception will be + thrown when a thread tries to re-enter a lock it already holds. However, if thread ownership + tracking is disabled, attempting to enter a lock already held will result in deadlock. + + True if the lock is acquired; otherwise, false. must be initialized to false prior to calling this method. + + Thread ownership tracking is enabled, and the current thread has already acquired this lock. + + + The argument must be initialized to false prior to calling Enter. + + + + + Attempts to acquire the lock in a reliable manner, such that even if an exception occurs within + the method call, can be examined reliably to determine whether the + lock was acquired. + + + Unlike , TryEnter will not block waiting for the lock to be available. If the + lock is not available when TryEnter is called, it will return immediately without any further + spinning. + + True if the lock is acquired; otherwise, false. must be initialized to false prior to calling this method. + + Thread ownership tracking is enabled, and the current thread has already acquired this lock. + + + The argument must be initialized to false prior to calling TryEnter. + + + + + Attempts to acquire the lock in a reliable manner, such that even if an exception occurs within + the method call, can be examined reliably to determine whether the + lock was acquired. + + + Unlike , TryEnter will not block indefinitely waiting for the lock to be + available. It will block until either the lock is available or until the + has expired. + + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + True if the lock is acquired; otherwise, false. must be initialized to false prior to calling this method. + + Thread ownership tracking is enabled, and the current thread has already acquired this lock. + + + The argument must be initialized to false prior to calling TryEnter. + + is a negative + number other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater + than milliseconds. + + + + + Attempts to acquire the lock in a reliable manner, such that even if an exception occurs within + the method call, can be examined reliably to determine whether the + lock was acquired. + + + Unlike , TryEnter will not block indefinitely waiting for the lock to be + available. It will block until either the lock is available or until the has expired. + + The number of milliseconds to wait, or (-1) to wait indefinitely. + True if the lock is acquired; otherwise, false. must be initialized to false prior to calling this method. + + Thread ownership tracking is enabled, and the current thread has already acquired this lock. + + + The argument must be initialized to false prior to calling TryEnter. + + is + a negative number other than -1, which represents an infinite time-out. + + + + Try acquire the lock with long path, this is usually called after the first path in Enter and + TryEnter failed The reason for short path is to make it inline in the run time which improves the + performance. This method assumed that the parameter are validated in Enter ir TryENter method + + The timeout milliseconds + The lockTaken param + + + + decrements the waiters, in case of the timeout is expired + + + + + ContinueTryEnter for the thread tracking mode enabled + + + + + Helper function to validate the timeout + + The start time in ticks + The orginal wait time + True if expired, false otherwise + + + + Releases the lock. + + + The default overload of provides the same behavior as if calling using true as the argument. + + + Thread ownership tracking is enabled, and the current thread is not the owner of this lock. + + + + + Releases the lock. + + + A Boolean value that indicates whether a memory fence should be issued in order to immediately + publish the exit operation to other threads. + + + Calling with the argument set to + true will improve the fairness of the lock at the expense of some performance. The default + overload behaves as if specifying true for . + + + Thread ownership tracking is enabled, and the current thread is not the owner of this lock. + + + + + Gets whether the lock is currently held by any thread. + + + + + Gets whether the lock is currently held by any thread. + + + Gets whether the lock is held by the current thread. + + + If the lock was initialized to track owner threads, this will return whether the lock is acquired + by the current thread. It is invalid to use this property when the lock was initialized to not + track thread ownership. + + + Thread ownership tracking is disabled. + + + + Gets whether thread ownership tracking is enabled for this instance. + + + + Internal class used by debug type proxy attribute to display the owner thread ID + + + + + SystemThreading_SpinLockDebugView constructor + + The SpinLock to be proxied. + + + + Checks if the lock is held by the current thread or not + + + + + Gets the current owner thread, zero if it is released + + + + + Gets whether the lock is currently held by any thread or not. + + + + + Stores options that configure the operation of methods on the + Parallel class. + + + By default, methods on the Parallel class attempt to utilize all available processors, are non-cancelable, and target + the default TaskScheduler (TaskScheduler.Default). enables + overriding these defaults. + + + + + Initializes a new instance of the class. + + + This constructor initializes the instance with default values. + is initialized to -1, signifying that there is no upper bound set on how much parallelism should + be employed. is initialized to a non-cancelable token, + and is initialized to the default scheduler (TaskScheduler.Default). + All of these defaults may be overwritten using the property set accessors on the instance. + + + + + Gets or sets the TaskScheduler + associated with this instance. Setting this property to null + indicates that the current scheduler should be used. + + + + + Gets or sets the maximum degree of parallelism enabled by this ParallelOptions instance. + + + The limits the number of concurrent operations run by Parallel method calls that are passed this + ParallelOptions instance to the set value, if it is positive. If is -1, then there is no limit placed on the number of concurrently + running operations. + + + The exception that is thrown when this is set to 0 or some + value less than -1. + + + + + Gets or sets the CancellationToken + associated with this instance. + + + Providing a CancellationToken + to a Parallel method enables the operation to be + exited early. Code external to the operation may cancel the token, and if the operation observes the + token being set, it may exit early by throwing an + . + + + + + Provides support for parallel loops and regions. + + + The class provides library-based data parallel replacements + for common operations such as for loops, for each loops, and execution of a set of statements. + + + + + Executes each of the provided actions, possibly in parallel. + + An array of Actions to execute. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null element. + The exception that is thrown when any + action in the array throws an exception. + + This method can be used to execute a set of operations, potentially in parallel. + No guarantees are made about the order in which the operations execute or whether + they execute in parallel. This method does not return until each of the + provided operations has completed, regardless of whether completion + occurs due to normal or exceptional termination. + + + + + Executes each of the provided actions, possibly in parallel. + + A ParallelOptions + instance that configures the behavior of this operation. + An array of Actions to execute. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null element. + The exception that is thrown when + the CancellationToken in the + is set. + The exception that is thrown when any + action in the array throws an exception. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + + This method can be used to execute a set of operations, potentially in parallel. + No guarantees are made about the order in which the operations execute or whether + the they execute in parallel. This method does not return until each of the + provided operations has completed, regardless of whether completion + occurs due to normal or exceptional termination. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the iteration count (an Int32) as a parameter. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the iteration count (an Int64) as a parameter. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the iteration count (an Int32) as a parameter. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the iteration count (an Int64) as a parameter. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int32), + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + Calling ParallelLoopState.Break() + informs the For operation that iterations after the current one need not + execute. However, all iterations before the current one will still need to be executed if they have not already. + Therefore, calling Break is similar to using a break operation within a + conventional for loop in a language like C#, but it is not a perfect substitute: for example, there is no guarantee that iterations + after the current one will definitely not execute. + + + If executing all iterations before the current one is not necessary, + ParallelLoopState.Stop() + should be preferred to using Break. Calling Stop informs the For loop that it may abandon all remaining + iterations, regardless of whether they're for interations above or below the current, + since all required work has already been completed. As with Break, however, there are no guarantees regarding + which other iterations will not execute. + + + When a loop is ended prematurely, the that's returned will contain + relevant information about the loop's completion. + + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int64), + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int32), + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + + + Executes a for loop in which iterations may run in parallel. + + The start index, inclusive. + The end index, exclusive. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int64), + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + + + Executes a for loop in which iterations may run in parallel. + + The type of the thread-local data. + The start index, inclusive. + The end index, exclusive. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int32), + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for loop in which iterations may run in parallel. Supports 64-bit indices. + + The type of the thread-local data. + The start index, inclusive. + The end index, exclusive. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int64), + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for loop in which iterations may run in parallel. + + The type of the thread-local data. + The start index, inclusive. + The end index, exclusive. + A ParallelOptions + instance that configures the behavior of this operation. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int32), + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for loop in which iterations may run in parallel. + + The type of the thread-local data. + The start index, inclusive. + The end index, exclusive. + A ParallelOptions + instance that configures the behavior of this operation. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each value in the iteration range: + [fromInclusive, toExclusive). It is provided with the following parameters: the iteration count (an Int64), + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Performs the major work of the parallel for loop. It assumes that argument validation has already + been performed by the caller. This function's whole purpose in life is to enable as much reuse of + common implementation details for the various For overloads we offer. Without it, we'd end up + with lots of duplicate code. It handles: (1) simple for loops, (2) for loops that depend on + ParallelState, and (3) for loops with thread local data. + + @TODO: at some point in the future, we may want to manually inline the interesting bits into the + specific overloads above. There is some overhead associated with the extra arguments passed to + the function, and various if-checks in the code. It is also more difficult to follow what the + code does as-is because it has to handle the three flavors. + + The type of the local data. + The loop's start index, inclusive. + The loop's end index, exclusive. + A ParallelOptions instance. + The simple loop body. + The loop body for ParallelState overloads. + The loop body for thread local state overloads. + A selector function that returns new thread local state. + A cleanup function to destroy thread local state. + Only one of the body arguments may be supplied (i.e. they are exclusive). + A structure. + + + + Performs the major work of the 64-bit parallel for loop. It assumes that argument validation has already + been performed by the caller. This function's whole purpose in life is to enable as much reuse of + common implementation details for the various For overloads we offer. Without it, we'd end up + with lots of duplicate code. It handles: (1) simple for loops, (2) for loops that depend on + ParallelState, and (3) for loops with thread local data. + + @TODO: at some point in the future, we may want to manually inline the interesting bits into the + specific overloads above. There is some overhead associated with the extra arguments passed to + the function, and various if-checks in the code. It is also more difficult to follow what the + code does as-is because it has to handle the three flavors. + + The type of the local data. + The loop's start index, inclusive. + The loop's end index, exclusive. + A ParallelOptions instance. + The simple loop body. + The loop body for ParallelState overloads. + The loop body for thread local state overloads. + A selector function that returns new thread local state. + A cleanup function to destroy thread local state. + Only one of the body arguments may be supplied (i.e. they are exclusive). + A structure. + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + An enumerable data source. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each element in the + enumerable. It is provided with the current element as a parameter. + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + An enumerable data source. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each element in the + enumerable. It is provided with the current element as a parameter. + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + An enumerable data source. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + An enumerable data source. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + An enumerable data source. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and the current element's index (an Int64). + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + An enumerable data source. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and the current element's index (an Int64). + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + The type of the thread-local data. + An enumerable data source. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + The type of the thread-local data. + An enumerable data source. + A ParallelOptions + instance that configures the behavior of this operation. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + The type of the thread-local data. + An enumerable data source. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, the current element's index (an Int64), and some local + state that may be shared amongst iterations that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for each operation on an + in which iterations may run in parallel. + + The type of the data in the source. + The type of the thread-local data. + An enumerable data source. + A ParallelOptions + instance that configures the behavior of this operation. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The delegate is invoked once for each element in the + enumerable. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, the current element's index (an Int64), and some local + state that may be shared amongst iterations that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Performs the major work of the parallel foreach loop. It assumes that argument validation has + already been performed by the caller. This function's whole purpose in life is to enable as much + reuse of common implementation details for the various For overloads we offer. Without it, we'd + end up with lots of duplicate code. It handles: (1) simple foreach loops, (2) foreach loops that + depend on ParallelState, and (3) foreach loops that access indices, (4) foreach loops with thread + local data, and any necessary permutations thereof. + + @TODO: at some point in the future, we may want to manually inline the interesting bits into the + specific overloads above. There is some overhead associated with the extra arguments passed to + the function, and various if-checks in the code. It is also more difficult to follow what the + code does as-is because it has to handle the all flavors. + + The type of the source data. + The type of the local data. + An enumerable data source. + ParallelOptions instance to use with this ForEach-loop + The simple loop body. + The loop body for ParallelState overloads. + The loop body for ParallelState/indexed overloads. + The loop body for ParallelState/thread local state overloads. + The loop body for ParallelState/indexed/thread local state overloads. + A selector function that returns new thread local state. + A cleanup function to destroy thread local state. + Only one of the bodyXX arguments may be supplied (i.e. they are exclusive). + A structure. + + + + A fast path for the more general ForEachWorker method above. This uses ldelem instructions to + access the individual elements of the array, which will be faster. + + The type of the source data. + The type of the local data. + An array data source. + The options to use for execution. + The simple loop body. + The loop body for ParallelState overloads. + The loop body for indexed/ParallelLoopState overloads. + The loop body for local/ParallelLoopState overloads. + The loop body for the most generic overload. + A selector function that returns new thread local state. + A cleanup function to destroy thread local state. + A structure. + + + + A fast path for the more general ForEachWorker method above. This uses IList<T>'s indexer + capabilities to access the individual elements of the list rather than an enumerator. + + The type of the source data. + The type of the local data. + A list data source. + The options to use for execution. + The simple loop body. + The loop body for ParallelState overloads. + The loop body for indexed/ParallelLoopState overloads. + The loop body for local/ParallelLoopState overloads. + The loop body for the most generic overload. + A selector function that returns new thread local state. + A cleanup function to destroy thread local state. + A structure. + + + + Executes a for each operation on a + Partitioner in which iterations may run in parallel. + + The type of the elements in . + The Partitioner that contains the original data source. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + SupportsDynamicPartitions property in the Partitioner returns + false. + The exception that is thrown when any + methods in the Partitioner return null. + The exception that is thrown when the + GetPartitions() method in the Partitioner does not return + the correct number of partitions. + The exception that is thrown when the + GetPartitions() method in the Partitioner returns an IList + with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() method in the Partitioner returns an + IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the current element as a parameter. + + + + + + Executes a for each operation on a + Partitioner in which iterations may run in parallel. + + The type of the elements in . + The Partitioner that contains the original data source. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + SupportsDynamicPartitions property in the Partitioner returns + false. + The exception that is thrown when any + methods in the Partitioner return null. + The exception that is thrown when the + GetPartitions() method in the Partitioner does not return + the correct number of partitions. + The exception that is thrown when the + GetPartitions() method in the Partitioner returns an IList + with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() method in the Partitioner returns an + IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + + + + Executes a for each operation on a + OrderablePartitioner in which iterations may run in parallel. + + The type of the elements in . + The OrderablePartitioner that contains the original data source. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + SupportsDynamicPartitions property in the OrderablePartitioner returns + false. + The exception that is thrown when the + KeysNormalized property in the OrderablePartitioner returns + false. + The exception that is thrown when any + methods in the OrderablePartitioner return null. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner do not return the correct number of partitions. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner return an IList with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() or GetDynamicOrderablePartitions() methods in the + OrderablePartitioner return an IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and the current element's index (an Int64). + + + + + + Executes a for each operation on a + Partitioner in which iterations may run in parallel. + + The type of the elements in . + The type of the thread-local data. + The Partitioner that contains the original data source. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + SupportsDynamicPartitions property in the Partitioner returns + false. + The exception that is thrown when any + methods in the Partitioner return null. + The exception that is thrown when the + GetPartitions() method in the Partitioner does not return + the correct number of partitions. + The exception that is thrown when the + GetPartitions() method in the Partitioner returns an IList + with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() method in the Partitioner returns an + IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for each operation on a + OrderablePartitioner in which iterations may run in parallel. + + The type of the elements in . + The type of the thread-local data. + The OrderablePartitioner that contains the original data source. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + SupportsDynamicPartitions property in the OrderablePartitioner returns + false. + The exception that is thrown when the + KeysNormalized property in the OrderablePartitioner returns + false. + The exception that is thrown when any + methods in the OrderablePartitioner return null. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner do not return the correct number of partitions. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner return an IList with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() or GetDynamicOrderablePartitions() methods in the + OrderablePartitioner return an IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, the current element's index (an Int64), and some local + state that may be shared amongst iterations that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for each operation on a + Partitioner in which iterations may run in parallel. + + The type of the elements in . + The Partitioner that contains the original data source. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown when the + SupportsDynamicPartitions property in the Partitioner returns + false. + The exception that is thrown when any + methods in the Partitioner return null. + The exception that is thrown when the + GetPartitions() method in the Partitioner does not return + the correct number of partitions. + The exception that is thrown when the + GetPartitions() method in the Partitioner returns an IList + with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() method in the Partitioner returns an + IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the current element as a parameter. + + + + + + Executes a for each operation on a + Partitioner in which iterations may run in parallel. + + The type of the elements in . + The Partitioner that contains the original data source. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown when the + SupportsDynamicPartitions property in the Partitioner returns + false. + The exception that is thrown when any + methods in the Partitioner return null. + The exception that is thrown when the + GetPartitions() method in the Partitioner does not return + the correct number of partitions. + The exception that is thrown when the + GetPartitions() method in the Partitioner returns an IList + with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() method in the Partitioner returns an + IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + and a ParallelLoopState instance that may be + used to break out of the loop prematurely. + + + + + + Executes a for each operation on a + OrderablePartitioner in which iterations may run in parallel. + + The type of the elements in . + The OrderablePartitioner that contains the original data source. + A ParallelOptions + instance that configures the behavior of this operation. + The delegate that is invoked once per iteration. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown when the + SupportsDynamicPartitions property in the OrderablePartitioner returns + false. + The exception that is thrown when the + KeysNormalized property in the OrderablePartitioner returns + false. + The exception that is thrown when any + methods in the OrderablePartitioner return null. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner do not return the correct number of partitions. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner return an IList with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() or GetDynamicOrderablePartitions() methods in the + OrderablePartitioner return an IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and the current element's index (an Int64). + + + + + + Executes a for each operation on a + Partitioner in which iterations may run in parallel. + + The type of the elements in . + The type of the thread-local data. + The Partitioner that contains the original data source. + A ParallelOptions + instance that configures the behavior of this operation. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown when the + SupportsDynamicPartitions property in the Partitioner returns + false. + The exception that is thrown when any + methods in the Partitioner return null. + The exception that is thrown when the + GetPartitions() method in the Partitioner does not return + the correct number of partitions. + The exception that is thrown when the + GetPartitions() method in the Partitioner returns an IList + with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() method in the Partitioner returns an + IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, and some local state that may be shared amongst iterations + that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Executes a for each operation on a + OrderablePartitioner in which iterations may run in parallel. + + The type of the elements in . + The type of the thread-local data. + The OrderablePartitioner that contains the original data source. + A ParallelOptions + instance that configures the behavior of this operation. + The function delegate that returns the initial state of the local data + for each thread. + The delegate that is invoked once per iteration. + The delegate that performs a final action on the local state of each + thread. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + CancellationToken in the + argument is set + The exception that is thrown when the + SupportsDynamicPartitions property in the OrderablePartitioner returns + false. + The exception that is thrown when the + KeysNormalized property in the OrderablePartitioner returns + false. + The exception that is thrown when any + methods in the OrderablePartitioner return null. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner do not return the correct number of partitions. + The exception that is thrown when the + GetPartitions() or GetOrderablePartitions() methods in the + OrderablePartitioner return an IList with at least one null value. + The exception that is thrown when the + GetDynamicPartitions() or GetDynamicOrderablePartitions() methods in the + OrderablePartitioner return an IEnumerable whose GetEnumerator() method returns null. + The exception that is thrown to contain an exception + thrown from one of the specified delegates. + The exception that is thrown when the + the CancellationTokenSource associated with the + the CancellationToken in the + has been disposed. + A ParallelLoopResult structure + that contains information on what portion of the loop completed. + + + The Partitioner is used to retrieve + the elements to be processed, in place of the original data source. If the current element's + index is desired, the source must be an + OrderablePartitioner. + + + The delegate is invoked once for each element in the + Partitioner. It is provided with the following parameters: the current element, + a ParallelLoopState instance that may be + used to break out of the loop prematurely, the current element's index (an Int64), and some local + state that may be shared amongst iterations that execute on the same thread. + + + The delegate is invoked once for each thread that participates in the loop's + execution and returns the initial local state for each of those threads. These initial states are passed to the first + invocations on each thread. Then, every subsequent body invocation returns a possibly + modified state value that is passed to the next body invocation. Finally, the last body invocation on each thread returns a state value + that is passed to the delegate. The localFinally delegate is invoked once per thread to perform a final + action on each thread's local state. + + + + + + Internal utility function that implements the OCE filtering behavior for all Parallel.* APIs. + Throws a single OperationCancelledException object with the token if the Exception collection only contains + OperationCancelledExceptions with the given CancellationToken. + + + The exception collection to filter + The CancellationToken expected on all inner exceptions + + + + + Enables iterations of loops to interact with + other iterations. + + + + + Communicates that the loop should cease execution at the system's earliest + convenience. + + + The method was previously called. and may not be used in combination by iterations of the same loop. + + + + may be used to communicate to the loop that no other iterations need be run. + For long-running iterations that may already be executing, causes + to return true for all other iterations of the loop, such that another iteration may check and exit early if it's observed to be true. + + + is typically employed in search-based algorithms, where once a result is found, + no other iterations need be executed. + + + + + + Communicates that the loop should cease execution at the system's earliest + convenience of iterations beyond the current iteration. + + + The method was previously called. and + may not be used in combination by iterations of the same loop. + + + + may be used to communicate to the loop that no other iterations after the + current iteration need be run. For example, if is called from the 100th + iteration of a for loop iterating in parallel from 0 to 1000, all iterations less than 100 should + still be run, but the iterations from 101 through to 1000 are not necessary. + + + For long-running iterations that may already be executing, causes + to be set to the current iteration's index if the current index is less than the current value of + . + + + is typically employed in search-based algorithms where an ordering is + present in the data source. + + + + + + Internal/virtual support for ShouldExitCurrentIteration. + + + + + Gets whether the current iteration of the loop should exit based + on requests made by this or other iterations. + + + When an iteration of a loop calls or , or + when one throws an exception, or when the loop is canceled, the class will proactively + attempt to prohibit additional iterations of the loop from starting execution. + However, there may be cases where it is unable to prevent additional iterations from starting. + It may also be the case that a long-running iteration has already begun execution. In such + cases, iterations may explicitly check the property and + cease execution if the property returns true. + + + + + Gets whether any iteration of the loop has called . + + + + + Gets whether any iteration of the loop has thrown an exception that went unhandled by that + iteration. + + + + + Internal/virtual support for LowestBreakIteration. + + + + + Gets the lowest iteration of the loop from which was called. + + + If no iteration of the loop called , this property will return null. + + + + + Internal constructor to ensure an instance isn't created by users. + + A flag shared among all threads participating + in the execution of a certain loop. + + + + Communicates that parallel tasks should stop when they reach a specified iteration element. + (which is CurrentIteration of the caller). + + Break() called after Stop(). + + This is shared with all other concurrent threads in the system which are participating in the + loop's execution. After calling Break(), no additional iterations will be executed on + the current thread, and other worker threads will execute once they get beyond the calling iteration. + + + + + Tracks the current loop iteration for the owning task. + This is used to compute whether or not the task should + terminate early due to a Break() call. + + + + + Returns true if we should be exiting from the current iteration + due to Stop(), Break() or exception. + + + + + Returns the lowest iteration at which Break() has been called, or + null if Break() has not yet been called. + + + + + Allows independent iterations of a parallel loop to interact with other iterations. + + + + + Internal constructor to ensure an instance isn't created by users. + + A flag shared among all threads participating + in the execution of a certain loop. + + + + Communicates that parallel tasks should stop when they reach a specified iteration element. + (which is CurrentIteration of the caller). + + Break() called after Stop(). + + Atomically sets shared StoppedBroken flag to BROKEN, then atomically sets shared + LowestBreakIteration to CurrentIteration, but only if CurrentIteration is less than + LowestBreakIteration. + + + + + Tracks the current loop iteration for the owning task. + This is used to compute whether or not the task should + terminate early due to a Break() call. + + + + + Returns true if we should be exiting from the current iteration + due to Stop(), Break() or exception. + + + + + Returns the lowest iteration at which Break() has been called, or + null if Break() has not yet been called. + + + + + State information that is common between ParallelStateFlags class + and ParallelStateFlags64 class. + + + + + An internal class used to share accounting information in 32-bit versions + of For()/ForEach() loops. + + + + + Lets the caller know whether or not to prematurely exit the For/ForEach loop. + If this returns true, then exit the loop. Otherwise, keep going. + + The caller's current iteration point + in the loop. + + The loop should exit on any one of the following conditions: + (1) Stop() has been called by one or more tasks. + (2) An exception has been raised by one or more tasks. + (3) Break() has been called by one or more tasks, and + CallerIteration exceeds the (lowest) iteration at which + Break() was called. + (4) The loop was canceled. + + + + + An internal class used to share accounting information in 64-bit versions + of For()/ForEach() loops. + + + + + Lets the caller know whether or not to prematurely exit the For/ForEach loop. + If this returns true, then exit the loop. Otherwise, keep going. + + The caller's current iteration point + in the loop. + + The loop should exit on any one of the following conditions: + (1) Stop() has been called by one or more tasks. + (2) An exception has been raised by one or more tasks. + (3) Break() has been called by one or more tasks, and + CallerIteration exceeds the (lowest) iteration at which + Break() was called. + (4) The loop has been canceled. + + + + + Provides completion status on the execution of a loop. + + + If returns true, then the loop ran to completion, such that all iterations + of the loop were executed. If returns false and returns null, a call to was used to end the loop prematurely. If returns false and returns a non-null integral + value, was used to end the loop prematurely. + + + + + Gets whether the loop ran to completion, such that all iterations of the loop were executed + and the loop didn't receive a request to end prematurely. + + + + + Gets the index of the lowest iteration from which + was called. + + + If was not employed, this property will + return null. + + + + + Utility class for allocating structs as heap variables + + + + + Represents an index range + + + + + The RangeWorker struct wraps the state needed by a task that services the parallel loop + + + + + Initializes a RangeWorker struct + + + + + Implements the core work search algorithm that will be used for this range worker. + + + Usage pattern is: + 1) the thread associated with this rangeworker calls FindNewWork + 2) if we return true, the worker uses the nFromInclusiveLocal and nToExclusiveLocal values + to execute the sequential loop + 3) if we return false it means there is no more work left. It's time to quit. + + + + + 32 bit integer version of FindNewWork. Assumes the ranges were initialized with 32 bit values. + + + + + Represents the entire loop operation, keeping track of workers and ranges. + + + The usage pattern is: + 1) The Parallel loop entry function (ForWorker) creates an instance of this class + 2) Every thread joining to service the parallel loop calls RegisterWorker to grab a + RangeWorker struct to wrap the state it will need to find and execute work, + and they keep interacting with that struct until the end of the loop + + + + Initializes a RangeManager with the given loop parameters, and the desired number of outer ranges + + + + + The function that needs to be called by each new worker thread servicing the parallel loop + in order to get a RangeWorker struct that wraps the state for finding and executing indices + + + + + Represents an asynchronous operation that produces a result at some time in the future. + + + The type of the result produced by this . + + + + instances may be created in a variety of ways. The most common approach is by + using the task's property to retrieve a instance that can be used to create tasks for several + purposes. For example, to create a that runs a function, the factory's StartNew + method may be used: + + // C# + var t = Task<int>.Factory.StartNew(() => GenerateResult()); + - or - + var t = Task.Factory.StartNew(() => GenerateResult()); + + ' Visual Basic + Dim t = Task<int>.Factory.StartNew(Function() GenerateResult()) + - or - + Dim t = Task.Factory.StartNew(Function() GenerateResult()) + + + + The class also provides constructors that initialize the task but that do not + schedule it for execution. For performance reasons, the StartNew method should be the + preferred mechanism for creating and scheduling computational tasks, but for scenarios where creation + and scheduling must be separated, the constructors may be used, and the task's + Start + method may then be used to schedule the task for execution at a later time. + + + All members of , except for + Dispose, are thread-safe + and may be used from multiple threads concurrently. + + + + + + Represents an asynchronous operation. + + + + instances may be created in a variety of ways. The most common approach is by + using the Task type's property to retrieve a instance that can be used to create tasks for several + purposes. For example, to create a that runs an action, the factory's StartNew + method may be used: + + // C# + var t = Task.Factory.StartNew(() => DoAction()); + + ' Visual Basic + Dim t = Task.Factory.StartNew(Function() DoAction()) + + + + The class also provides constructors that initialize the Task but that do not + schedule it for execution. For performance reasons, TaskFactory's StartNew method should be the + preferred mechanism for creating and scheduling computational tasks, but for scenarios where creation + and scheduling must be separated, the constructors may be used, and the task's + method may then be used to schedule the task for execution at a later time. + + + All members of , except for , are thread-safe + and may be used from multiple threads concurrently. + + + For operations that return values, the class + should be used. + + + For developers implementing custom debuggers, several internal and private members of Task may be + useful (these may change from release to release). The Int32 m_taskId field serves as the backing + store for the property, however accessing this field directly from a debugger may be + more efficient than accessing the same value through the property's getter method (the + s_taskIdCounter Int32 counter is used to retrieve the next available ID for a Task). Similarly, the + Int32 m_stateFlags field stores information about the current lifecycle stage of the Task, + information also accessible through the property. The m_action System.Object + field stores a reference to the Task's delegate, and the m_stateObject System.Object field stores the + async state passed to the Task by the developer. Finally, for debuggers that parse stack frames, the + InternalWait method serves a potential marker for when a Task is entering a wait operation. + + + + + + A type initializer that runs with the appropriate permissions. + + + + + Initializes a new with the specified action. + + The delegate that represents the code to execute in the Task. + The argument is null. + + + + Initializes a new with the specified action and CancellationToken. + + The delegate that represents the code to execute in the Task. + The CancellationToken + that will be assigned to the new Task. + The argument is null. + The provided CancellationToken + has already been disposed. + + + + + Initializes a new with the specified action and creation options. + + The delegate that represents the code to execute in the task. + + The TaskCreationOptions used to + customize the Task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + + + + Initializes a new with the specified action and creation options. + + The delegate that represents the code to execute in the task. + The that will be assigned to the new task. + + The TaskCreationOptions used to + customize the Task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + The provided CancellationToken + has already been disposed. + + + + + Initializes a new with the specified action and state. + + The delegate that represents the code to execute in the task. + An object representing data to be used by the action. + + The argument is null. + + + + + Initializes a new with the specified action, state, snd options. + + The delegate that represents the code to execute in the task. + An object representing data to be used by the action. + The that will be assigned to the new task. + + The argument is null. + + The provided CancellationToken + has already been disposed. + + + + + Initializes a new with the specified action, state, snd options. + + The delegate that represents the code to execute in the task. + An object representing data to be used by the action. + + The TaskCreationOptions used to + customize the Task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + + + + Initializes a new with the specified action, state, snd options. + + The delegate that represents the code to execute in the task. + An object representing data to be used by the action. + The that will be assigned to the new task. + + The TaskCreationOptions used to + customize the Task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + The provided CancellationToken + has already been disposed. + + + + + An internal constructor used by the factory methods on task and its descendent(s). + This variant does not capture the ExecutionContext; it is up to the caller to do that. + + An action to execute. + Optional state to pass to the action. + Parent of Task. + A CancellationToken for the task. + A task scheduler under which the task will run. + Options to control its execution. + Internal options to control its execution + + + + Common logic used by the following internal ctors: + Task() + Task(object action, object state, Task parent, TaskCreationOptions options, TaskScheduler taskScheduler) + + ASSUMES THAT m_creatingTask IS ALREADY SET. + + + Action for task to execute. + Object to which to pass to action (may be null) + Task scheduler on which to run thread (only used by continuation tasks). + A CancellationToken for the Task. + Options to customize behavior of Task. + Internal options to customize behavior of Task. + + + + Checks if we registered a CT callback during construction, and deregisters it. + This should be called when we know the registration isn't useful anymore. Specifically from Finish() if the task has completed + successfully or with an exception. + + + + + Captures the ExecutionContext so long as flow isn't suppressed. + + A stack crawl mark pointing to the frame of the caller. + + + + Internal function that will be called by a new child task to add itself to + the children list of the parent (this). + + Since a child task can only be created from the thread executing the action delegate + of this task, reentrancy is neither required nor supported. This should not be called from + anywhere other than the task construction/initialization codepaths. + + + + + Starts the , scheduling it for execution to the current TaskScheduler. + + + A task may only be started and run only once. Any attempts to schedule a task a second time + will result in an exception. + + + The is not in a valid state to be started. It may have already been started, + executed, or canceled, or it may have been created in a manner that doesn't support direct + scheduling. + + + The instance has been disposed. + + + + + Starts the , scheduling it for execution to the specified TaskScheduler. + + + A task may only be started and run only once. Any attempts to schedule a task a second time will + result in an exception. + + + The TaskScheduler with which to associate + and execute this task. + + + The argument is null. + + + The is not in a valid state to be started. It may have already been started, + executed, or canceled, or it may have been created in a manner that doesn't support direct + scheduling. + + + The instance has been disposed. + + + + + Runs the synchronously on the current TaskScheduler. + + + + A task may only be started and run only once. Any attempts to schedule a task a second time will + result in an exception. + + + Tasks executed with will be associated with the current TaskScheduler. + + + If the target scheduler does not support running this Task on the current thread, the Task will + be scheduled for execution on the scheduler, and the current thread will block until the + Task has completed execution. + + + + The is not in a valid state to be started. It may have already been started, + executed, or canceled, or it may have been created in a manner that doesn't support direct + scheduling. + + + The instance has been disposed. + + + + + Runs the synchronously on the scheduler provided. + + + + A task may only be started and run only once. Any attempts to schedule a task a second time will + result in an exception. + + + If the target scheduler does not support running this Task on the current thread, the Task will + be scheduled for execution on the scheduler, and the current thread will block until the + Task has completed execution. + + + + The is not in a valid state to be started. It may have already been started, + executed, or canceled, or it may have been created in a manner that doesn't support direct + scheduling. + + + The instance has been disposed. + + The parameter + is null. + The scheduler on which to attempt to run this task inline. + + + + Throws an exception if the task has been disposed, and hence can no longer be accessed. + + The task has been disposed. + + + + Sets the internal completion event. + + + + + Disposes the , releasing all of its unmanaged resources. + + + Unlike most of the members of , this method is not thread-safe. + Also, may only be called on a that is in one of + the final states: RanToCompletion, + Faulted, or + Canceled. + + + The exception that is thrown if the is not in + one of the final states: RanToCompletion, + Faulted, or + Canceled. + + + + + Disposes the , releasing all of its unmanaged resources. + + + A Boolean value that indicates whether this method is being called due to a call to . + + + Unlike most of the members of , this method is not thread-safe. + + + + + Schedules the task for execution. + + If true, TASK_STATE_STARTED bit is turned on in + an atomic fashion, making sure that TASK_STATE_CANCELED does not get set + underneath us. If false, TASK_STATE_STARTED bit is OR-ed right in. This + allows us to streamline things a bit for StartNew(), where competing cancellations + are not a problem. + + + + Adds an exception to the list of exceptions this task has thrown. + + An object representing either an Exception or a collection of Exceptions. + + + + Returns a list of exceptions by aggregating the holder's contents. Or null if + no exceptions have been thrown. + + Whether to include a TCE if cancelled. + An aggregate exception, or null if no exceptions have been caught. + + + + Throws an aggregate exception if the task contains exceptions. + + + + + Checks whether this is an attached task, and whether we are being called by the parent task. + And sets the TASK_STATE_EXCEPTIONOBSERVEDBYPARENT status flag based on that. + + This is meant to be used internally when throwing an exception, and when WaitAll is gathering + exceptions for tasks it waited on. If this flag gets set, the implicit wait on children + will skip exceptions to prevent duplication. + + This should only be called when this task has completed with an exception + + + + + + Signals completion of this particular task. + + The bUserDelegateExecuted parameter indicates whether this Finish() call comes following the + full execution of the user delegate. + + If bUserDelegateExecuted is false, it mean user delegate wasn't invoked at all (either due to + a cancellation request, or because this task is a promise style Task). In this case, the steps + involving child tasks (i.e. WaitForChildren) will be skipped. + + + + + + FinishStageTwo is to be executed as soon as we known there are no more children to complete. + It can happen i) either on the thread that originally executed this task (if no children were spawned, or they all completed by the time this task's delegate quit) + ii) or on the thread that executed the last child. + + + + + Final stage of the task completion code path. Notifies the parent (if any) that another of its childre are done, and runs continuations. + This function is only separated out from FinishStageTwo because these two operations are also needed to be called from CancellationCleanupLogic() + + + + + This is called by children of this task when they are completed. + + + + + This is to be called just before the task does its final state transition. + It traverses the list of exceptional children, and appends their aggregate exceptions into this one's exception list + + + + + Special purpose Finish() entry point to be used when the task delegate throws a ThreadAbortedException + This makes a note in the state flags so that we avoid any costly synchronous operations in the finish codepath + such as inlined continuations + + + Indicates whether the ThreadAbortException was added to this task's exception holder. + This should always be true except for the case of non-root self replicating task copies. + + Whether the delegate was executed. + + + + Executes the task. This method will only be called once, and handles bookeeping associated with + self-replicating tasks, in addition to performing necessary exception marshaling. + + The task has already been disposed. + + + + IThreadPoolWorkItem override, which is the entry function for this task when the TP scheduler decides to run it. + + + + + + The ThreadPool calls this if a ThreadAbortException is thrown while trying to execute this workitem. This may occur + before Task would otherwise be able to observe it. + + + + + Outermost entry function to execute this task. Handles all aspects of executing a task on the caller thread. + Currently this is called by IThreadPoolWorkItem.ExecuteWorkItem(), and TaskManager.TryExecuteInline. + + + Performs atomic updates to prevent double execution. Should only be set to true + in codepaths servicing user provided TaskSchedulers. The ConcRT or ThreadPool schedulers don't need this. + + + + The actual code which invokes the body of the task. This can be overriden in derived types. + + + + + Alternate InnerInvoke prototype to be called from ExecuteSelfReplicating() so that + the Parallel Debugger can discover the actual task being invoked. + Details: Here, InnerInvoke is actually being called on the rootTask object while we are actually executing the + childTask. And the debugger needs to discover the childTask, so we pass that down as an argument. + The NoOptimization and NoInlining flags ensure that the childTask pointer is retained, and that this + function appears on the callstack. + + + + + + Performs whatever handling is necessary for an unhandled exception. Normally + this just entails adding the exception to the holder object. + + The exception that went unhandled. + + + + Waits for the to complete execution. + + + The was canceled -or- an exception was thrown during + the execution of the . + + + The has been disposed. + + + + + Waits for the to complete execution. + + + A that represents the number of milliseconds to wait, or a that represents -1 milliseconds to wait indefinitely. + + + true if the completed execution within the allotted time; otherwise, false. + + + The was canceled -or- an exception was thrown during the execution of the . + + + is a negative number other than -1 milliseconds, which represents an + infinite time-out -or- timeout is greater than + . + + + The has been disposed. + + + + + Waits for the to complete execution. + + + A to observe while waiting for the task to complete. + + + The was canceled. + + + The was canceled -or- an exception was thrown during the execution of the . + + + The + has been disposed. + + + + + Waits for the to complete execution. + + + The number of milliseconds to wait, or (-1) to + wait indefinitely. + true if the completed execution within the allotted time; otherwise, + false. + + + is a negative number other than -1, which represents an + infinite time-out. + + + The was canceled -or- an exception was thrown during the execution of the . + + + The + has been disposed. + + + + + Waits for the to complete execution. + + + The number of milliseconds to wait, or (-1) to + wait indefinitely. + + + A to observe while waiting for the task to complete. + + + true if the completed execution within the allotted time; otherwise, false. + + + The was canceled -or- an exception was thrown during the execution of the . + + + The + has been disposed. + + + is a negative number other than -1, which represents an + infinite time-out. + + + The was canceled. + + + + + The core wait function, which is only accesible internally. It's meant to be used in places in TPL code where + the current context is known or cached. + + + + + Cancels the . + + Indiactes whether we should only cancel non-invoked tasks. + For the default scheduler this option will only be serviced through TryDequeue. + For custom schedulers we also attempt an atomic state transition. + true if the task was successfully canceled; otherwise, false. + The + has been disposed. + + + + Sets the task's cancellation acknowledged flag. + + + + + Runs all of the continuations, as appropriate. + + + + + Helper function to determine whether the current task is in the state desired by the + continuation kind under evaluation. Three possibilities exist: the task failed with + an unhandled exception (OnFailed), the task was canceled before running (OnAborted), + or the task completed successfully (OnCompletedSuccessfully). Note that the last + one includes completing due to cancellation. + + The continuation options under evaluation. + True if the continuation should be run given the task's current state. + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + The that will be assigned to the new continuation task. + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + The to associate with the continuation task and to use for its execution. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed. If the continuation criteria specified through the parameter are not met, the continuation task will be canceled + instead of scheduled. + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + The that will be assigned to the new continuation task. + + The to associate with the continuation task and to use for its + execution. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed. If the criteria specified through the parameter + are not met, the continuation task will be canceled instead of scheduled. + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + The that will be assigned to the new continuation task. + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + The to associate with the continuation task and to use for its execution. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed. If the continuation criteria specified through the parameter are not met, the continuation task will be canceled + instead of scheduled. + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + The that will be assigned to the new continuation task. + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + + The to associate with the continuation task and to use for its + execution. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed. If the criteria specified through the parameter + are not met, the continuation task will be canceled instead of scheduled. + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Converts TaskContinuationOptions to TaskCreationOptions, and also does + some validity checking along the way. + + Incoming TaskContinuationOptions + Outgoing TaskCreationOptions + Outgoing InternalTaskOptions + + + + Registers the continuation and possibly runs it (if the task is already finished). + + The continuation task itself. + TaskScheduler with which to associate continuation task. + Restrictions on when the continuation becomes active. + + + + Waits for all of the provided objects to complete execution. + + + An array of instances on which to wait. + + + The argument is null. + + + The argument contains a null element. + + + At least one of the instances was canceled -or- an exception was thrown during + the execution of at least one of the instances. + + + The has been disposed. + + + + + Waits for all of the provided objects to complete execution. + + + true if all of the instances completed execution within the allotted time; + otherwise, false. + + + An array of instances on which to wait. + + + A that represents the number of milliseconds to wait, or a that represents -1 milliseconds to wait indefinitely. + + + The argument is null. + + + The argument contains a null element. + + + At least one of the instances was canceled -or- an exception was thrown during + the execution of at least one of the instances. + + + is a negative number other than -1 milliseconds, which represents an + infinite time-out -or- timeout is greater than + . + + + The has been disposed. + + + + + Waits for all of the provided objects to complete execution. + + + true if all of the instances completed execution within the allotted time; + otherwise, false. + + + The number of milliseconds to wait, or (-1) to + wait indefinitely. + An array of instances on which to wait. + + + The argument is null. + + + The argument contains a null element. + + + At least one of the instances was canceled -or- an exception was thrown during + the execution of at least one of the instances. + + + The has been disposed. + + + is a negative number other than -1, which represents an + infinite time-out. + + + + + Waits for all of the provided objects to complete execution. + + + true if all of the instances completed execution within the allotted time; + otherwise, false. + + + An array of instances on which to wait. + + + A to observe while waiting for the tasks to complete. + + + The argument is null. + + + The argument contains a null element. + + + At least one of the instances was canceled -or- an exception was thrown during + the execution of at least one of the instances. + + + The was canceled. + + + The has been disposed. + + + + + Waits for all of the provided objects to complete execution. + + + true if all of the instances completed execution within the allotted time; + otherwise, false. + + + An array of instances on which to wait. + + + The number of milliseconds to wait, or (-1) to + wait indefinitely. + + + A to observe while waiting for the tasks to complete. + + + The argument is null. + + + The argument contains a null element. + + + At least one of the instances was canceled -or- an exception was thrown during + the execution of at least one of the instances. + + + The has been disposed. + + + is a negative number other than -1, which represents an + infinite time-out. + + + The was canceled. + + + + + Waits for a set of handles in a STA-aware way. In other words, it will wait for each + of the events individually if we're on a STA thread, because MsgWaitForMultipleObjectsEx + can't do a true wait-all due to its hidden message queue event. This is not atomic, + of course, but we only wait on one-way (MRE) events anyway so this is OK. + + An array of wait handles to wait on. + The timeout to use during waits. + The cancellationToken that enables a wait to be canceled. + True if all waits succeeded, false if a timeout occurred. + + + + Internal WaitAll implementation which is meant to be used with small number of tasks, + optimized for Parallel.Invoke and other structured primitives. + + + + + This internal function is only meant to be called by WaitAll() + If the completed task is canceled or it has other exceptions, here we will add those + into the passed in exception list (which will be lazily initialized here). + + + + + Waits for any of the provided objects to complete execution. + + + An array of instances on which to wait. + + The index of the completed task in the array argument. + + The argument is null. + + + The argument contains a null element. + + + The has been disposed. + + + + + Waits for any of the provided objects to complete execution. + + + An array of instances on which to wait. + + + A that represents the number of milliseconds to wait, or a that represents -1 milliseconds to wait indefinitely. + + + The index of the completed task in the array argument, or -1 if the + timeout occurred. + + + The argument is null. + + + The argument contains a null element. + + + The has been disposed. + + + is a negative number other than -1 milliseconds, which represents an + infinite time-out -or- timeout is greater than + . + + + + + Waits for any of the provided objects to complete execution. + + + An array of instances on which to wait. + + + A to observe while waiting for a task to complete. + + + The index of the completed task in the array argument. + + + The argument is null. + + + The argument contains a null element. + + + The has been disposed. + + + The was canceled. + + + + + Waits for any of the provided objects to complete execution. + + + An array of instances on which to wait. + + + The number of milliseconds to wait, or (-1) to + wait indefinitely. + + + The index of the completed task in the array argument, or -1 if the + timeout occurred. + + + The argument is null. + + + The argument contains a null element. + + + The has been disposed. + + + is a negative number other than -1, which represents an + infinite time-out. + + + + + Waits for any of the provided objects to complete execution. + + + An array of instances on which to wait. + + + The number of milliseconds to wait, or (-1) to + wait indefinitely. + + + A to observe while waiting for a task to complete. + + + The index of the completed task in the array argument, or -1 if the + timeout occurred. + + + The argument is null. + + + The argument contains a null element. + + + The has been disposed. + + + is a negative number other than -1, which represents an + infinite time-out. + + + The was canceled. + + + + + Gets a unique ID for this Task instance. + + + Task IDs are assigned on-demand and do not necessarily represent the order in the which Task + instances were created. + + + + + Returns the unique ID of the currently executing Task. + + + + + Gets the Task instance currently executing, or + null if none exists. + + + + + Gets the StackGuard object assigned to the current thread. + + + + + Gets the Exception that caused the Task to end prematurely. If the Task completed successfully or has not yet thrown any + exceptions, this will return null. + + + Tasks that throw unhandled exceptions store the resulting exception and propagate it wrapped in a + in calls to Wait + or in accesses to the property. Any exceptions not observed by the time + the Task instance is garbage collected will be propagated on the finalizer thread. + + + The Task + has been disposed. + + + + + Gets the TaskStatus of this Task. + + + + + Gets whether this Task instance has completed + execution due to being canceled. + + + A Task will complete in Canceled state either if its CancellationToken + was marked for cancellation before the task started executing, or if the task acknowledged the cancellation request on + its already signaled CancellationToken by throwing an + OperationCanceledException that bears the same + CancellationToken. + + + + + Returns true if this task has a cancellation token and it was signaled. + To be used internally in execute entry codepaths. + + + + + This internal property provides access to the CancellationToken that was set on the task + when it was constructed. + + + + + Gets whether this threw an OperationCanceledException while its CancellationToken was signaled. + + + + + Gets whether this Task has completed. + + + will return true when the Task is in one of the three + final states: RanToCompletion, + Faulted, or + Canceled. + + + + + Checks whether this task has been disposed. + + + + + Gets the TaskCreationOptions used + to create this task. + + + + + Gets a that can be used to wait for the task to + complete. + + + Using the wait functionality provided by + should be preferred over using for similar + functionality. + + + The has been disposed. + + + + + Gets the state object supplied when the Task was created, + or null if none was supplied. + + + + + Gets an indication of whether the asynchronous operation completed synchronously. + + true if the asynchronous operation completed synchronously; otherwise, false. + + + + Provides access to the TaskScheduler responsible for executing this Task. + + + + + Provides access to factory methods for creating and instances. + + + The factory returned from is a default instance + of , as would result from using + the default constructor on TaskFactory. + + + + + Provides an event that can be used to wait for completion. + Only called by Wait*(), which means that we really do need to instantiate a completion event. + + + + + Determines whether this is the root task of a self replicating group. + + + + + Determines whether the task is a replica itself. + + + + + The property formerly known as IsFaulted. + + + + + Gets whether the completed due to an unhandled exception. + + + If is true, the Task's will be equal to + TaskStatus.Faulted, and its + property will be non-null. + + + + + Checks whether the TASK_STATE_EXCEPTIONOBSERVEDBYPARENT status flag is set, + This will only be used by the implicit wait to prevent double throws + + + + + + Checks whether the body was ever invoked. Used by task scheduler code to verify custom schedulers actually ran the task. + + + + + A structure to hold continuation information. + + + + + Constructs a new continuation structure. + + The task to be activated. + The continuation options. + The scheduler to use for the continuation. + + + + Invokes the continuation for the target completion task. + + The completed task. + Whether the continuation can be inlined. + + + + Initializes a new with the specified function. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + + The argument is null. + + + + + Initializes a new with the specified function. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + The to be assigned to this task. + + The argument is null. + + The provided CancellationToken + has already been disposed. + + + + + Initializes a new with the specified function and creation options. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + + The TaskCreationOptions used to + customize the task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + + + + Initializes a new with the specified function and creation options. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + The that will be assigned to the new task. + + The TaskCreationOptions used to + customize the task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + The provided CancellationToken + has already been disposed. + + + + + Initializes a new with the specified function and state. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + An object representing data to be used by the action. + + The argument is null. + + + + + Initializes a new with the specified action, state, and options. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + An object representing data to be used by the function. + The to be assigned to the new task. + + The argument is null. + + The provided CancellationToken + has already been disposed. + + + + + Initializes a new with the specified action, state, and options. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + An object representing data to be used by the function. + + The TaskCreationOptions used to + customize the task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + + + + Initializes a new with the specified action, state, and options. + + + The delegate that represents the code to execute in the task. When the function has completed, + the task's property will be set to return the result value of the function. + + An object representing data to be used by the function. + The to be assigned to the new task. + + The TaskCreationOptions used to + customize the task's behavior. + + + The argument is null. + + + The argument specifies an invalid value for . + + The provided CancellationToken + has already been disposed. + + + + + Creates a new future object. + + The parent task for this future. + A function that yields the future value. + The task scheduler which will be used to execute the future. + The CancellationToken for the task. + Options to control the future's behavior. + Internal options to control the future's behavior. + The argument specifies + a SelfReplicating , which is illegal."/>. + + + + Creates a new future object. + + The parent task for this future. + An object containing data to be used by the action; may be null. + A function that yields the future value. + The CancellationToken for the task. + The task scheduler which will be used to execute the future. + Options to control the future's behavior. + Internal options to control the future's behavior. + The argument specifies + a SelfReplicating , which is illegal."/>. + + + + Evaluates the value selector of the Task which is passed in as an object and stores the result. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + The that will be assigned to the new continuation task. + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + The to associate with the continuation task and to use for its execution. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed. If the continuation criteria specified through the parameter are not met, the continuation task will be canceled + instead of scheduled. + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + An action to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + The that will be assigned to the new continuation task. + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + + The to associate with the continuation task and to use for its + execution. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed. If the criteria specified through the parameter + are not met, the continuation task will be canceled instead of scheduled. + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + A new continuation . + + The returned will not be scheduled for execution until the current + task has completed, whether it completes due to running to completion successfully, faulting due + to an unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + The that will be assigned to the new task. + A new continuation . + + The returned will not be scheduled for execution until the current + task has completed, whether it completes due to running to completion successfully, faulting due + to an unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + The to associate with the continuation task and to use for its execution. + + A new continuation . + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The argument is null. + + + The argument is null. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be + passed the completed task as an argument. + + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + A new continuation . + + + The returned will not be scheduled for execution until the current + task has completed, whether it completes due to running to completion successfully, faulting due + to an unhandled exception, or exiting out early due to being canceled. + + + The , when executed, should return a . This task's completion state will be transferred to the task returned + from the ContinueWith call. + + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The has been disposed. + + + + + Creates a continuation that executes when the target completes. + + + The type of the result produced by the continuation. + + + A function to run when the completes. When run, the delegate will be passed as + an argument this completed task. + + The that will be assigned to the new task. + + Options for when the continuation is scheduled and how it behaves. This includes criteria, such + as OnlyOnCanceled, as + well as execution options, such as ExecuteSynchronously. + + + The to associate with the continuation task and to use for its + execution. + + A new continuation . + + + The returned will not be scheduled for execution until the current task has + completed, whether it completes due to running to completion successfully, faulting due to an + unhandled exception, or exiting out early due to being canceled. + + + The , when executed, should return a . + This task's completion state will be transferred to the task returned from the + ContinueWith call. + + + + The argument is null. + + + The argument specifies an invalid value for TaskContinuationOptions. + + + The argument is null. + + + The has been disposed. + + The provided CancellationToken + has already been disposed. + + + + + Gets the result value of this . + + + The get accessor for this property ensures that the asynchronous operation is complete before + returning. Once the result of the computation is available, it is stored and will be returned + immediately on later calls to . + + + + + Provides access to factory methods for creating instances. + + + The factory returned from is a default instance + of , as would result from using + the default constructor on the factory type. + + + + + Provides support for creating and scheduling + Task{TResult} objects. + + The type of the results that are available though + the Task{TResult} objects that are associated with + the methods in this class. + + + There are many common patterns for which tasks are relevant. The + class encodes some of these patterns into methods that pick up default settings, which are + configurable through its constructors. + + + A default instance of is available through the + Task{TResult}.Factory property. + + + + + + Initializes a instance with the default configuration. + + + This constructor creates a instance with a default configuration. The + property is initialized to + TaskCreationOptions.None, the + property is initialized to TaskContinuationOptions.None, + and the TaskScheduler property is + initialized to the current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the default configuration. + + The default that will be assigned + to tasks created by this unless another CancellationToken is explicitly specified + while calling the factory methods. + + This constructor creates a instance with a default configuration. The + property is initialized to + TaskCreationOptions.None, the + property is initialized to TaskContinuationOptions.None, + and the TaskScheduler property is + initialized to the current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the specified configuration. + + + The + TaskScheduler to use to schedule any tasks created with this TaskFactory{TResult}. A null value + indicates that the current TaskScheduler should be used. + + + With this constructor, the + property is initialized to + TaskCreationOptions.None, the + property is initialized to TaskContinuationOptions.None, + and the TaskScheduler property is + initialized to , unless it's null, in which case the property is + initialized to the current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the specified configuration. + + + The default + TaskCreationOptions to use when creating tasks with this TaskFactory{TResult}. + + + The default + TaskContinuationOptions to use when creating continuation tasks with this TaskFactory{TResult}. + + + The exception that is thrown when the + argument or the + argument specifies an invalid value. + + + With this constructor, the + property is initialized to , + the + property is initialized to , and the TaskScheduler property is initialized to the + current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the specified configuration. + + The default that will be assigned + to tasks created by this unless another CancellationToken is explicitly specified + while calling the factory methods. + + The default + TaskCreationOptions to use when creating tasks with this TaskFactory{TResult}. + + + The default + TaskContinuationOptions to use when creating continuation tasks with this TaskFactory{TResult}. + + + The default + TaskScheduler to use to schedule any Tasks created with this TaskFactory{TResult}. A null value + indicates that TaskScheduler.Current should be used. + + + The exception that is thrown when the + argument or the + argumentspecifies an invalid value. + + + With this constructor, the + property is initialized to , + the + property is initialized to , and the TaskScheduler property is initialized to + , unless it's null, in which case the property is initialized to the + current scheduler (see TaskScheduler.Current). + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + The started . + The exception that is thrown when the + argument is null. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + The that will be assigned to the new task. + The started . + The exception that is thrown when the + argument is null. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + A TaskCreationOptions value that controls the behavior of the + created + . + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + A TaskCreationOptions value that controls the behavior of the + created + . + The that will be assigned to the new task. + The TaskScheduler + that is used to schedule the created + Task{TResult}. + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + The started . + The exception that is thrown when the + argument is null. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + The that will be assigned to the new task. + The started . + The exception that is thrown when the + argument is null. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + A TaskCreationOptions value that controls the behavior of the + created + . + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + The that will be assigned to the new task. + A TaskCreationOptions value that controls the behavior of the + created + . + The TaskScheduler + that is used to schedule the created + Task{TResult}. + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates a Task that executes an end + method function when a specified IAsyncResult completes. + + The IAsyncResult whose completion should trigger the processing of the + . + The function delegate that processes the completed . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + A Task that represents the + asynchronous operation. + + + + Creates a Task that executes an end + method function when a specified IAsyncResult completes. + + The IAsyncResult whose completion should trigger the processing of the + . + The function delegate that processes the completed . + The TaskCreationOptions value that controls the behavior of the + created Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + A Task that represents the + asynchronous operation. + + + + Creates a Task that executes an end + method function when a specified IAsyncResult completes. + + The IAsyncResult whose completion should trigger the processing of the + . + The function delegate that processes the completed . + The TaskScheduler + that is used to schedule the task that executes the end method. + The TaskCreationOptions value that controls the behavior of the + created Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + A Task that represents the + asynchronous operation. + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The type of the third argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The third argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The type of the third argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The third argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The function delegate to execute when all tasks in + the array have completed. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The function delegate to execute when all tasks in + the array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The function delegate to execute when all tasks in the array have completed. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The function delegate to execute when all tasks in the array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation . + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the array completes. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the array completes. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the array completes. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the array completes. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation . + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Gets the default CancellationToken of this + TaskFactory. + + + This property returns the default that will be assigned to all + tasks created by this factory unless another CancellationToken value is explicitly specified + during the call to the factory methods. + + + + + Gets the TaskScheduler of this + TaskFactory{TResult}. + + + This property returns the default scheduler for this factory. It will be used to schedule all + tasks unless another scheduler is explicitly specified during calls to this factory's methods. + If null, TaskScheduler.Current + will be used. + + + + + Gets the TaskCreationOptions + value of this TaskFactory{TResult}. + + + This property returns the default creation options for this factory. They will be used to create all + tasks unless other options are explicitly specified during calls to this factory's methods. + + + + + Gets the TaskContinuationOptions + value of this TaskFactory{TResult}. + + + This property returns the default continuation options for this factory. They will be used to create + all continuation tasks unless other options are explicitly specified during calls to this factory's methods. + + + + + Represents the current stage in the lifecycle of a . + + + + + The task has been initialized but has not yet been scheduled. + + + + + The task is waiting to be activated and scheduled internally by the .NET Framework infrastructure. + + + + + The task has been scheduled for execution but has not yet begun executing. + + + + + The task is running but has not yet completed. + + + + + The task has finished executing and is implicitly waiting for + attached child tasks to complete. + + + + + The task completed execution successfully. + + + + + The task acknowledged cancellation by throwing an OperationCanceledException with its own CancellationToken + while the token was in signaled state, or the task's CancellationToken was already signaled before the + task started executing. + + + + + The task completed due to an unhandled exception. + + + + + In some cases a replica will want to quit prematurely (ie. before finishing a chunk of work it may have grabbed) + yet they will need the next replica to pick things up from where they left. This API is used to save such state. + + Calling it is also the only way to record a premature exit. + + + + + + Specifies flags that control optional behavior for the creation and execution of tasks. + + + + + Specifies that the default behavior should be used. + + + + + A hint to a TaskScheduler to schedule a + task in as fair a manner as possible, meaning that tasks scheduled sooner will be more likely to + be run sooner, and tasks scheduled later will be more likely to be run later. + + + + + Specifies that a task will be a long-running, course-grained operation. It provides a hint to the + TaskScheduler that oversubscription may be + warranted. + + + + + Specifies that a task is attached to a parent in the task hierarchy. + + + + + Task creation flags which are only used internally. + + + + Specifies "No internal task options" + + + Used to filter out internal vs. public task creation options. + + + Specifies that the task will be queued by the runtime before handing it over to the user. + This flag will be used to skip the cancellationtoken registration step, which is only meant for unstarted tasks. + + + + Specifies flags that control optional behavior for the creation and execution of continuation tasks. + + + + + Default = "Continue on any, no task options, run asynchronously" + Specifies that the default behavior should be used. Continuations, by default, will + be scheduled when the antecedent task completes, regardless of the task's final TaskStatus. + + + + + A hint to a TaskScheduler to schedule a + task in as fair a manner as possible, meaning that tasks scheduled sooner will be more likely to + be run sooner, and tasks scheduled later will be more likely to be run later. + + + + + Specifies that a task will be a long-running, course-grained operation. It provides + a hint to the TaskScheduler that + oversubscription may be warranted. + + + + + Specifies that a task is attached to a parent in the task hierarchy. + + + + + Specifies that the continuation task should not be scheduled if its antecedent ran to completion. + This option is not valid for multi-task continuations. + + + + + Specifies that the continuation task should not be scheduled if its antecedent threw an unhandled + exception. This option is not valid for multi-task continuations. + + + + + Specifies that the continuation task should not be scheduled if its antecedent was canceled. This + option is not valid for multi-task continuations. + + + + + Specifies that the continuation task should be scheduled only if its antecedent ran to + completion. This option is not valid for multi-task continuations. + + + + + Specifies that the continuation task should be scheduled only if its antecedent threw an + unhandled exception. This option is not valid for multi-task continuations. + + + + + Specifies that the continuation task should be scheduled only if its antecedent was canceled. + This option is not valid for multi-task continuations. + + + + + Specifies that the continuation task should be executed synchronously. With this option + specified, the continuation will be run on the same thread that causes the antecedent task to + transition into its final state. If the antecedent is already complete when the continuation is + created, the continuation will run on the thread creating the continuation. Only very + short-running continuations should be executed synchronously. + + + + + Internal helper class to keep track of stack depth and decide whether we should inline or not. + + + + + This method needs to be called before attempting inline execution on the current thread. + If false is returned, it means we are too close to the end of the stack and should give up inlining. + Each call to TryBeginInliningScope() that returns true must be matched with a + call to EndInliningScope() regardless of whether inlining actually took place. + + + + + This needs to be called once for each previous successful TryBeginInliningScope() call after + inlining related logic runs. + + + + + Represents an exception used to communicate task cancellation. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the + class with a specified error message and a reference to the inner exception that is the cause of + this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception. + + + + Initializes a new instance of the class + with a reference to the that has been canceled. + + A task that has been canceled. + + + + Initializes a new instance of the + class with serialized data. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + + Gets the task associated with this exception. + + + It is permissible for no Task to be associated with a + , in which case + this property will return null. + + + + + An exception holder manages a list of exceptions for one particular task. + It offers the ability to aggregate, but more importantly, also offers intrinsic + support for propagating unhandled exceptions that are never observed. It does + this by aggregating and throwing if the holder is ever GC'd without the holder's + contents ever having been requested (e.g. by a Task.Wait, Task.get_Exception, etc). + + + + + Creates a new holder; it will be registered for finalization. + + The task this holder belongs to. + + + + A finalizer that repropagates unhandled exceptions. + + + + + Add an exception to the internal list. This will ensure the holder is + in the proper state (handled/unhandled) depending on the list's contents. + + An exception object (either an Exception or an + IEnumerable{Exception}) to add to the list. + + + + A private helper method that ensures the holder is considered + unhandled, i.e. it is registered for finalization. + + + + + A private helper method that ensures the holder is considered + handled, i.e. it is not registered for finalization. + + Whether this is called from the finalizer thread. + + + + Allocates a new aggregate exception and adds the contents of the list to + it. By calling this method, the holder assumes exceptions to have been + "observed", such that the finalization check will be subsequently skipped. + + Whether this is being called from a finalizer. + An extra exception to be included (optionally). + The aggregate exception to throw. + + + + Provides support for creating and scheduling + Tasks. + + + + There are many common patterns for which tasks are relevant. The + class encodes some of these patterns into methods that pick up default settings, which are + configurable through its constructors. + + + A default instance of is available through the + Task.Factory property. + + + + + + Initializes a instance with the default configuration. + + + This constructor creates a instance with a default configuration. The + property is initialized to + TaskCreationOptions.None, the + property is initialized to TaskContinuationOptions.None, + and the TaskScheduler property is + initialized to the current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the specified configuration. + + The default that will be assigned + to tasks created by this unless another CancellationToken is explicitly specified + while calling the factory methods. + + This constructor creates a instance with a default configuration. The + property is initialized to + TaskCreationOptions.None, the + property is initialized to TaskContinuationOptions.None, + and the TaskScheduler property is + initialized to the current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the specified configuration. + + + The + TaskScheduler to use to schedule any tasks created with this TaskFactory. A null value + indicates that the current TaskScheduler should be used. + + + With this constructor, the + property is initialized to + TaskCreationOptions.None, the + property is initialized to TaskContinuationOptions.None, + and the TaskScheduler property is + initialized to , unless it's null, in which case the property is + initialized to the current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the specified configuration. + + + The default + TaskCreationOptions to use when creating tasks with this TaskFactory. + + + The default + TaskContinuationOptions to use when creating continuation tasks with this TaskFactory. + + + The exception that is thrown when the + argument or the + argument specifies an invalid value. + + + With this constructor, the + property is initialized to , + the + property is initialized to , and the TaskScheduler property is initialized to the + current scheduler (see TaskScheduler.Current). + + + + + Initializes a instance with the specified configuration. + + The default that will be assigned + to tasks created by this unless another CancellationToken is explicitly specified + while calling the factory methods. + + The default + TaskCreationOptions to use when creating tasks with this TaskFactory. + + + The default + TaskContinuationOptions to use when creating continuation tasks with this TaskFactory. + + + The default + TaskScheduler to use to schedule any Tasks created with this TaskFactory. A null value + indicates that TaskScheduler.Current should be used. + + + The exception that is thrown when the + argument or the + argumentspecifies an invalid value. + + + With this constructor, the + property is initialized to , + the + property is initialized to , and the TaskScheduler property is initialized to + , unless it's null, in which case the property is initialized to the + current scheduler (see TaskScheduler.Current). + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + The started Task. + The exception that is thrown when the + argument is null. + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors + and then calling + Start to schedule it for execution. However, + unless creation and scheduling must be separated, StartNew is the recommended + approach for both simplicity and performance. + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + The that will be assigned to the new task. + The started Task. + The exception that is thrown when the + argument is null. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors + and then calling + Start to schedule it for execution. However, + unless creation and scheduling must be separated, StartNew is the recommended + approach for both simplicity and performance. + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + A TaskCreationOptions value that controls the behavior of the + created + Task. + The started Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors and + then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + The that will be assigned to the new + A TaskCreationOptions value that controls the behavior of the + created + Task. + The TaskScheduler + that is used to schedule the created Task. + The started Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors and + then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + An object containing data to be used by the + delegate. + The started Task. + The exception that is thrown when the + argument is null. + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors and + then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + An object containing data to be used by the + delegate. + The that will be assigned to the new + The started Task. + The exception that is thrown when the + argument is null. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors and + then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + An object containing data to be used by the + delegate. + A TaskCreationOptions value that controls the behavior of the + created + Task. + The started Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors and + then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a Task. + + The action delegate to execute asynchronously. + An object containing data to be used by the + delegate. + The that will be assigned to the new task. + A TaskCreationOptions value that controls the behavior of the + created + Task. + The TaskScheduler + that is used to schedule the created Task. + The started Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a Task using one of its constructors and + then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + The started . + The exception that is thrown when the + argument is null. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + The that will be assigned to the new + The started . + The exception that is thrown when the + argument is null. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + A TaskCreationOptions value that controls the behavior of the + created + . + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + The that will be assigned to the new task. + A TaskCreationOptions value that controls the behavior of the + created + . + The TaskScheduler + that is used to schedule the created + Task{TResult}. + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + The started . + The exception that is thrown when the + argument is null. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + The that will be assigned to the new + The started . + The exception that is thrown when the + argument is null. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + A TaskCreationOptions value that controls the behavior of the + created + . + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates and starts a . + + The type of the result available through the + Task. + + A function delegate that returns the future result to be available through + the . + An object containing data to be used by the + delegate. + The that will be assigned to the new task. + A TaskCreationOptions value that controls the behavior of the + created + . + The TaskScheduler + that is used to schedule the created + Task{TResult}. + The started . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The provided CancellationToken + has already been disposed. + + + Calling StartNew is functionally equivalent to creating a using one + of its constructors and then calling + Start to schedule it for execution. + However, unless creation and scheduling must be separated, StartNew is the recommended approach + for both simplicity and performance. + + + + + Creates a Task that executes an end method action + when a specified IAsyncResult completes. + + The IAsyncResult whose completion should trigger the processing of the + . + The action delegate that processes the completed . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + A Task that represents the asynchronous + operation. + + + + Creates a Task that executes an end method action + when a specified IAsyncResult completes. + + The IAsyncResult whose completion should trigger the processing of the + . + The action delegate that processes the completed . + The TaskCreationOptions value that controls the behavior of the + created Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + A Task that represents the asynchronous + operation. + + + + Creates a Task that executes an end method action + when a specified IAsyncResult completes. + + The IAsyncResult whose completion should trigger the processing of the + . + The action delegate that processes the completed . + The TaskScheduler + that is used to schedule the task that executes the end method. + The TaskCreationOptions value that controls the behavior of the + created Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + A Task that represents the asynchronous + operation. + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the + delegate. + The type of the second argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the + delegate. + The type of the second argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the + delegate. + The type of the second argument passed to + delegate. + The type of the third argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The third argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of begin + and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the + delegate. + The type of the second argument passed to + delegate. + The type of the third argument passed to + delegate. + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The third argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that represents the + asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that executes an end + method function when a specified IAsyncResult completes. + + The type of the result available through the + Task. + + The IAsyncResult whose completion should trigger the processing of the + . + The function delegate that processes the completed . + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + A Task that represents the + asynchronous operation. + + + + Creates a Task that executes an end + method function when a specified IAsyncResult completes. + + The type of the result available through the + Task. + + The IAsyncResult whose completion should trigger the processing of the + . + The function delegate that processes the completed . + The TaskCreationOptions value that controls the behavior of the + created Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + A Task that represents the + asynchronous operation. + + + + Creates a Task that executes an end + method function when a specified IAsyncResult completes. + + The type of the result available through the + Task. + + The IAsyncResult whose completion should trigger the processing of the + . + The function delegate that processes the completed . + The TaskScheduler + that is used to schedule the task that executes the end method. + The TaskCreationOptions value that controls the behavior of the + created Task. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + A Task that represents the + asynchronous operation. + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The type of the third argument passed to + delegate. + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The third argument passed to the + delegate. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Creates a Task that represents a pair of + begin and end methods that conform to the Asynchronous Programming Model pattern. + + The type of the first argument passed to the delegate. + The type of the second argument passed to + delegate. + The type of the third argument passed to + delegate. + The type of the result available through the + Task. + + The delegate that begins the asynchronous operation. + The delegate that ends the asynchronous operation. + The first argument passed to the + delegate. + The second argument passed to the + delegate. + The third argument passed to the + delegate. + The TaskCreationOptions value that controls the behavior of the + created Task. + An object containing data to be used by the + delegate. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument specifies an invalid TaskCreationOptions + value. + The created Task that + represents the asynchronous operation. + + This method throws any exceptions thrown by the . + + + + + Check validity of options passed to FromAsync method + + The options to be validated. + determines type of FromAsync method that called this method + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The action delegate to execute when all tasks in + the array have completed. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The action delegate to execute when all tasks in + the array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The action delegate to execute when all tasks in the array have completed. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The array of tasks from which to continue. + The action delegate to execute when all tasks in the array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The action delegate to execute when all tasks in + the array have completed. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The action delegate to execute when all tasks in + the array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The action delegate to execute when all tasks in the array have completed. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result of the antecedent . + The array of tasks from which to continue. + The action delegate to execute when all tasks in the array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation . + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of a set of provided Tasks. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue. + The function delegate to execute when all tasks in the + array have completed. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation . + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAll. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the array completes. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the array completes. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the array completes. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the array completes. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation Task. + The new continuation Task. + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation . + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result that is returned by the + delegate and associated with the created . + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The function delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation . + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the + array completes. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the + array completes. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Creates a continuation Task + that will be started upon the completion of any Task in the provided set. + + The type of the result of the antecedent . + The array of tasks from which to continue when one task completes. + The action delegate to execute when one task in the + array completes. + The CancellationToken + that will be assigned to the new continuation task. + The + TaskContinuationOptions value that controls the behavior of + the created continuation Task. + The TaskScheduler + that is used to schedule the created continuation . + The new continuation . + The exception that is thrown when the + array is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + argument is null. + The exception that is thrown when the + array contains a null value. + The exception that is thrown when the + array is empty. + The exception that is thrown when the + argument specifies an invalid TaskContinuationOptions + value. + The exception that is thrown when one + of the elements in the array has been disposed. + The provided CancellationToken + has already been disposed. + + + The NotOn* and OnlyOn* TaskContinuationOptions, + which constrain for which TaskStatus states a continuation + will be executed, are illegal with ContinueWhenAny. + + + + + Gets the default CancellationToken of this + TaskFactory. + + + This property returns the default that will be assigned to all + tasks created by this factory unless another CancellationToken value is explicitly specified + during the call to the factory methods. + + + + + Gets the TaskScheduler of this + TaskFactory. + + + This property returns the default scheduler for this factory. It will be used to schedule all + tasks unless another scheduler is explicitly specified during calls to this factory's methods. + If null, TaskScheduler.Current + will be used. + + + + + Gets the TaskCreationOptions + value of this TaskFactory. + + + This property returns the default creation options for this factory. They will be used to create all + tasks unless other options are explicitly specified during calls to this factory's methods. + + + + + Gets the TaskContinuationOptions + value of this TaskFactory. + + + This property returns the default continuation options for this factory. They will be used to create + all continuation tasks unless other options are explicitly specified during calls to this factory's methods. + + + + + Represents the producer side of a unbound to a + delegate, providing access to the consumer side through the property. + + + + It is often the case that a is desired to + represent another asynchronous operation. + TaskCompletionSource is provided for this purpose. It enables + the creation of a task that can be handed out to consumers, and those consumers can use the members + of the task as they would any other. However, unlike most tasks, the state of a task created by a + TaskCompletionSource is controlled explicitly by the methods on TaskCompletionSource. This enables the + completion of the external asynchronous operation to be propagated to the underlying Task. The + separation also ensures that consumers are not able to transition the state without access to the + corresponding TaskCompletionSource. + + + All members of are thread-safe + and may be used from multiple threads concurrently. + + + The type of the result value assocatied with this . + + + + Creates a . + + + + + Creates a + with the specified options. + + + The created + by this instance and accessible through its property + will be instantiated using the specified . + + The options to use when creating the underlying + . + + The represent options invalid for use + with a . + + + + + Creates a + with the specified state. + + The state to use as the underlying + 's AsyncState. + + + + Creates a with + the specified state and options. + + The options to use when creating the underlying + . + The state to use as the underlying + 's AsyncState. + + The represent options invalid for use + with a . + + + + + Attempts to transition the underlying + into the + Faulted + state. + + The exception to bind to this . + True if the operation was successful; otherwise, false. + This operation will return false if the + is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The argument is null. + The was disposed. + + + + Attempts to transition the underlying + into the + Faulted + state. + + The collection of exceptions to bind to this . + True if the operation was successful; otherwise, false. + This operation will return false if the + is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The argument is null. + There are one or more null elements in . + The collection is empty. + The was disposed. + + + + Transitions the underlying + into the + Faulted + state. + + The exception to bind to this . + The argument is null. + + The underlying is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The was disposed. + + + + Transitions the underlying + into the + Faulted + state. + + The collection of exceptions to bind to this . + The argument is null. + There are one or more null elements in . + + The underlying is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The was disposed. + + + + Attempts to transition the underlying + into the + RanToCompletion + state. + + The result value to bind to this . + True if the operation was successful; otherwise, false. + This operation will return false if the + is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The was disposed. + + + + Transitions the underlying + into the + RanToCompletion + state. + + The result value to bind to this . + + The underlying is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The was disposed. + + + + Transitions the underlying + into the + Canceled + state. + + + The underlying is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The was disposed. + + + + Attempts to transition the underlying + into the + Canceled + state. + + True if the operation was successful; otherwise, false. + This operation will return false if the + is already in one + of the three final states: + RanToCompletion, + Faulted, or + Canceled. + + The was disposed. + + + + Gets the created + by this . + + + This property enables a consumer access to the that is controlled by this instance. + The , , + , and + methods (and their "Try" variants) on this instance all result in the relevant state + transitions on this underlying Task. + + + + + Represents an abstract scheduler for tasks. + + + + TaskScheduler acts as the extension point for all + pluggable scheduling logic. This includes mechanisms such as how to schedule a task for execution, and + how scheduled tasks should be exposed to debuggers. + + + All members of the abstract type are thread-safe + and may be used from multiple threads concurrently. + + + + + + Queues a Task to the scheduler. + + + + A class derived from TaskScheduler + implements this method to accept tasks being scheduled on the scheduler. + A typical implementation would store the task in an internal data structure, which would + be serviced by threads that would execute those tasks at some time in the future. + + + This method is only meant to be called by the .NET Framework and + should not be called directly by the derived class. This is necessary + for maintaining the consistency of the system. + + + The Task to be queued. + The argument is null. + + + + Determines whether the provided Task + can be executed synchronously in this call, and if it can, executes it. + + + + A class derived from TaskScheduler implements this function to + support inline execution of a task on a thread that initiates a wait on that task object. Inline + execution is optional, and the request may be rejected by returning false. However, better + scalability typically results the more tasks that can be inlined, and in fact a scheduler that + inlines too little may be prone to deadlocks. A proper implementation should ensure that a + request executing under the policies guaranteed by the scheduler can successfully inline. For + example, if a scheduler uses a dedicated thread to execute tasks, any inlining requests from that + thread should succeed. + + + If a scheduler decides to perform the inline execution, it should do so by calling to the base + TaskScheduler's + TryExecuteTask method with the provided task object, propagating + the return value. It may also be appropriate for the scheduler to remove an inlined task from its + internal data structures if it decides to honor the inlining request. Note, however, that under + some circumstances a scheduler may be asked to inline a task that was not previously provided to + it with the method. + + + The derived scheduler is responsible for making sure that the calling thread is suitable for + executing the given task as far as its own scheduling and execution policies are concerned. + + + The Task to be + executed. + A Boolean denoting whether or not task has previously been + queued. If this parameter is True, then the task may have been previously queued (scheduled); if + False, then the task is known not to have been queued, and this call is being made in order to + execute the task inline without queueing it. + A Boolean value indicating whether the task was executed inline. + The argument is + null. + The was already + executed. + + + + Generates an enumerable of Task instances + currently queued to the scheduler waiting to be executed. + + + + A class derived from implements this method in order to support + integration with debuggers. This method will only be invoked by the .NET Framework when the + debugger requests access to the data. The enumerable returned will be traversed by debugging + utilities to access the tasks currently queued to this scheduler, enabling the debugger to + provide a representation of this information in the user interface. + + + It is important to note that, when this method is called, all other threads in the process will + be frozen. Therefore, it's important to avoid synchronization with other threads that may lead to + blocking. If synchronization is necessary, the method should prefer to throw a + than to block, which could cause a debugger to experience delays. Additionally, this method and + the enumerable returned must not modify any globally visible state. + + + The returned enumerable should never be null. If there are currently no queued tasks, an empty + enumerable should be returned instead. + + + For developers implementing a custom debugger, this method shouldn't be called directly, but + rather this functionality should be accessed through the internal wrapper method + GetScheduledTasksForDebugger: + internal Task[] GetScheduledTasksForDebugger(). This method returns an array of tasks, + rather than an enumerable. In order to retrieve a list of active schedulers, a debugger may use + another internal method: internal static TaskScheduler[] GetTaskSchedulersForDebugger(). + This static method returns an array of all active TaskScheduler instances. + GetScheduledTasksForDebugger then may be used on each of these scheduler instances to retrieve + the list of scheduled tasks for each. + + + An enumerable that allows traversal of tasks currently queued to this scheduler. + + + This scheduler is unable to generate a list of queued tasks at this time. + + + + + Retrieves some thread static state that can be cached and passed to multiple + TryRunInline calls, avoiding superflous TLS fetches. + + A bag of TLS state (or null if none exists). + + + + Attempts to execute the target task synchronously. + + The task to run. + True if the task may have been previously queued, + false if the task was absolutely not previously queued. + The state retrieved from GetThreadStatics + True if it ran, false otherwise. + + + + Attempts to dequeue a Task that was previously queued to + this scheduler. + + The Task to be dequeued. + A Boolean denoting whether the argument was successfully dequeued. + The argument is null. + + + + Notifies the scheduler that a work item has made progress. + + + + + Initializes the . + + + + + Frees all resources associated with this scheduler. + + + + + Creates a + associated with the current . + + + All Task instances queued to + the returned scheduler will be executed through a call to the + Post method + on that context. + + + A associated with + the current SynchronizationContext, as + determined by SynchronizationContext.Current. + + + The current SynchronizationContext may not be used as a TaskScheduler. + + + + + Attempts to execute the provided Task + on this scheduler. + + + + Scheduler implementations are provided with Task + instances to be executed through either the method or the + method. When the scheduler deems it appropriate to run the + provided task, should be used to do so. TryExecuteTask handles all + aspects of executing a task, including action invocation, exception handling, state management, + and lifecycle control. + + + must only be used for tasks provided to this scheduler by the .NET + Framework infrastructure. It should not be used to execute arbitrary tasks obtained through + custom mechanisms. + + + + A Task object to be executed. + + The is not associated with this scheduler. + + A Boolean that is true if was successfully executed, false if it + was not. A common reason for execution failure is that the task had previously been executed or + is in the process of being executed by another thread. + + + + Provides an array of all queued Task instances + for the debugger. + + + The returned array is populated through a call to . + Note that this function is only meant to be invoked by a debugger remotely. + It should not be called by any other codepaths. + + An array of Task instances. + + This scheduler is unable to generate a list of queued tasks at this time. + + + + + Provides an array of all active TaskScheduler + instances for the debugger. + + + This function is only meant to be invoked by a debugger remotely. + It should not be called by any other codepaths. + + An array of TaskScheduler instances. + + + + Registers a new TaskScheduler instance in the global collection of schedulers. + + + + + Removes a TaskScheduler instance from the global collection of schedulers. + + + + + Indicates the maximum concurrency level this + is able to support. + + + + + Indicates whether this is a custom scheduler, in which case the safe code paths will be taken upon task entry + using a CAS to transition from queued state to executing. + + + + + Gets the default TaskScheduler instance. + + + + + Gets the TaskScheduler + associated with the currently executing task. + + + When not called from within a task, will return the scheduler. + + + + + Gets the unique ID for this . + + + + + Occurs when a faulted 's unobserved exception is about to trigger exception escalation + policy, which, by default, would terminate the process. + + + This AppDomain-wide event provides a mechanism to prevent exception + escalation policy (which, by default, terminates the process) from triggering. + Each handler is passed a + instance, which may be used to examine the exception and to mark it as observed. + + + + + Nested class that provides debugger view for TaskScheduler + + + + + A TaskScheduler implementation that executes all tasks queued to it through a call to + on the + that its associated with. The default constructor for this class binds to the current + + + + + Constructs a SynchronizationContextTaskScheduler associated with + + This constructor expects to be set. + + + + Implemetation of for this scheduler class. + + Simply posts the tasks to be executed on the associated . + + + + + + Implementation of for this scheduler class. + + The task will be executed inline only if the call happens within + the associated . + + + + + + + Implementes the property for + this scheduler class. + + By default it returns 1, because a based + scheduler only supports execution on a single thread. + + + + + Provides data for the event that is raised when a faulted 's + exception goes unobserved. + + + The Exception property is used to examine the exception without marking it + as observed, whereas the method is used to mark the exception + as observed. Marking the exception as observed prevents it from triggering exception escalation policy + which, by default, terminates the process. + + + + + Initializes a new instance of the class + with the unobserved exception. + + The Exception that has gone unobserved. + + + + Marks the as "observed," thus preventing it + from triggering exception escalation policy which, by default, terminates the process. + + + + + Gets whether this exception has been marked as "observed." + + + + + The Exception that went unobserved. + + + + + An implementation of TaskScheduler that uses the ThreadPool scheduler + + + + + Constructs a new ThreadPool task scheduler object + + + + + Schedules a task to the ThreadPool. + + The task to schedule. + + + + This internal function will do this: + (1) If the task had previously been queued, attempt to pop it and return false if that fails. + (2) Propagate the return value from Task.ExecuteEntry() back to the caller. + + IMPORTANT NOTE: TryExecuteTaskInline will NOT throw task exceptions itself. Any wait code path using this function needs + to account for exceptions that need to be propagated, and throw themselves accordingly. + + + + + Notifies the scheduler that work is progressing (no-op). + + + + + This is the only scheduler that returns false for this property, indicating that the task entry codepath is unsafe (CAS free) + since we know that the underlying scheduler already takes care of atomic transitions from queued to non-queued. + + + + + Represents an exception used to communicate an invalid operation by a + . + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the + class with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the + class using the default error message and a reference to the inner exception that is the cause of + this exception. + + The exception that is the cause of the current exception. + + + + Initializes a new instance of the + class with a specified error message and a reference to the inner exception that is the cause of + this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception. + + + + Initializes a new instance of the + class with serialized data. + + The that holds + the serialized object data about the exception being thrown. + The that + contains contextual information about the source or destination. + + + + The exception that is thrown when the post-phase action of a fails. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified inner exception. + + The exception that is the cause of the current exception. + + + + Initializes a new instance of the class with a specified error message. + + A string that describes the exception. + + + + Initializes a new instance of the class with a specified error message and inner exception. + + A string that describes the exception. + The exception that is the cause of the current exception. + + + + Initializes a new instance of the class with serialized data. + + The object that holds the serialized object data. + An object that describes the source or destination of the serialized data. + + + + Enables multiple tasks to cooperatively work on an algorithm in parallel through multiple phases. + + + + A group of tasks cooperate by moving through a series of phases, where each in the group signals it + has arrived at the in a given phase and implicitly waits for all others to + arrive. The same can be used for multiple phases. + + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads, with the exception of Dispose, which + must only be used when all other operations on the have + completed. + + + + + + Initializes a new instance of the class. + + The number of participating threads. + is less than 0 + or greater than . + + + + Initializes a new instance of the class. + + The number of participating threads. + The to be executed after each + phase. + is less than 0 + or greater than . + + The delegate will be executed after + all participants have arrived at the barrier in one phase. The participants + will not be released to the next phase until the postPhaseAction delegate + has completed execution. + + + + + Extract the three variables current, total and sense from a given big variable + + The integer variable that contains the other three variables + The current cparticipant count + The total participants count + The sense flag + + + + Write the three variables current. total and the sense to the m_currentTotal + + The old current total to compare + The current cparticipant count + The total participants count + The sense flag + True if the CAS succeeded, false otherwise + + + + Notifies the that there will be an additional participant. + + The phase number of the barrier in which the new participants will first + participate. + + Adding a participant would cause the barrier's participant count to + exceed . + + + The method was invoked from within a post-phase action. + + The current instance has already been + disposed. + + + + Notifies the that there will be additional participants. + + The number of additional participants to add to the + barrier. + The phase number of the barrier in which the new participants will first + participate. + is less than + 0. + Adding participants would cause the + barrier's participant count to exceed . + + The method was invoked from within a post-phase action. + + The current instance has already been + disposed. + + + + Notifies the that there will be one less participant. + + The barrier already has 0 + participants. + + The method was invoked from within a post-phase action. + + The current instance has already been + disposed. + + + + Notifies the that there will be fewer participants. + + The number of additional participants to remove from the barrier. + is less than + 0. + The barrier already has 0 participants. + + The method was invoked from within a post-phase action. + + The current instance has already been + disposed. + + + + Signals that a participant has reached the and waits for all other + participants to reach the barrier as well. + + + The method was invoked from within a post-phase action, the barrier currently has 0 participants, + or the barrier is being used by more threads than are registered as participants. + + The current instance has already been + disposed. + + + + Signals that a participant has reached the and waits for all other + participants to reach the barrier, while observing a . + + The to + observe. + + The method was invoked from within a post-phase action, the barrier currently has 0 participants, + or the barrier is being used by more threads than are registered as participants. + + has been + canceled. + The current instance has already been + disposed. + + + + Signals that a participant has reached the and waits for all other + participants to reach the barrier as well, using a + to measure the time interval. + + A that represents the number of + milliseconds to wait, or a that represents -1 milliseconds to + wait indefinitely. + true if all other participants reached the barrier; otherwise, false. + is a negative number + other than -1 milliseconds, which represents an infinite time-out, or it is greater than + . + + The method was invoked from within a post-phase action, the barrier currently has 0 participants, + or the barrier is being used by more threads than are registered as participants. + + The current instance has already been + disposed. + + + + Signals that a participant has reached the and waits for all other + participants to reach the barrier as well, using a + to measure the time interval, while observing a . + + A that represents the number of + milliseconds to wait, or a that represents -1 milliseconds to + wait indefinitely. + The to + observe. + true if all other participants reached the barrier; otherwise, false. + is a negative number + other than -1 milliseconds, which represents an infinite time-out. + + The method was invoked from within a post-phase action, the barrier currently has 0 participants, + or the barrier is being used by more threads than are registered as participants. + + has been + canceled. + The current instance has already been + disposed. + + + + Signals that a participant has reached the and waits for all other + participants to reach the barrier as well, using a + 32-bit signed integer to measure the time interval. + + The number of milliseconds to wait, or (-1) to wait indefinitely. + true if all other participants reached the barrier; otherwise, false. + is a + negative number other than -1, which represents an infinite time-out. + + The method was invoked from within a post-phase action, the barrier currently has 0 participants, + or the barrier is being used by more threads than are registered as participants. + + The current instance has already been + disposed. + + + + Signals that a participant has reached the barrier and waits for all other participants to reach + the barrier as well, using a + 32-bit signed integer to measure the time interval, while observing a . + + The number of milliseconds to wait, or (-1) to wait indefinitely. + The to + observe. + true if all other participants reached the barrier; otherwise, false. + is a + negative number other than -1, which represents an infinite time-out. + + The method was invoked from within a post-phase action, the barrier currently has 0 participants, + or the barrier is being used by more threads than are registered as participants. + + has been + canceled. + The current instance has already been + disposed. + + + + Finish the phase by invoking the post phase action, and setting the event, this must be called by the + last arrival thread + + The current phase sense + + + + Sets the current phase event and reset the next phase event + + The current phase sense + + + + Releases all resources used by the current instance of . + + + The method was invoked from within a post-phase action. + + + Unlike most of the members of , Dispose is not thread-safe and may not be + used concurrently with other members of this instance. + + + + + When overridden in a derived class, releases the unmanaged resources used by the + , and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release + only unmanaged resources. + + Unlike most of the members of , Dispose is not thread-safe and may not be + used concurrently with other members of this instance. + + + + + Throw ObjectDisposedException if the barrier is disposed + + + + + Gets the number of participants in the barrier that haven’t yet signaled + in the current phase. + + + This could be 0 during a post-phase action delegate execution or if the + ParticipantCount is 0. + + + + + Gets the total number of participants in the barrier. + + + + + Gets the number of the barrier's current phase. + + + + + Provides blocking and bounding capabilities for thread-safe collections that + implement . + + + represents a collection + that allows for thread-safe adding and removing of data. + is used as a wrapper + for an instance, allowing + removal attempts from the collection to block until data is available to be removed. Similarly, + a can be created to enforce + an upper-bound on the number of data elements allowed in the + ; addition attempts to the + collection may then block until space is available to store the added items. In this manner, + is similar to a traditional + blocking queue data structure, except that the underlying data storage mechanism is abstracted + away as an . + + Specifies the type of elements in the collection. + + + Initializes a new instance of the + + class without an upper-bound. + + + The default underlying collection is a ConcurrentQueue<T>. + + + + Initializes a new instance of the + class with the specified upper-bound. + + The bounded size of the collection. + The is + not a positive value. + + The default underlying collection is a ConcurrentQueue<T>. + + + + Initializes a new instance of the + class with the specified upper-bound and using the provided + as its underlying data store. + The collection to use as the underlying data store. + The bounded size of the collection. + The argument is + null. + The is not a positive value. + The supplied contains more values + than is permitted by . + + + Initializes a new instance of the + class without an upper-bound and using the provided + as its underlying data store. + The collection to use as the underlying data store. + The argument is + null. + + + Initializes the BlockingCollection instance. + The collection to use as the underlying data store. + The bounded size of the collection. + The number of items currently in the underlying collection. + + + + Adds the item to the . + + The item to be added to the collection. The value can be a null reference. + The has been marked + as complete with regards to additions. + The has been disposed. + The underlying collection didn't accept the item. + + If a bounded capacity was specified when this instance of + was initialized, + a call to Add may block until space is available to store the provided item. + + + + + Adds the item to the . + A is thrown if the is + canceled. + + The item to be added to the collection. The value can be a null reference. + A cancellation token to observe. + If the is canceled. + The has been marked + as complete with regards to additions. + The has been disposed. + The underlying collection didn't accept the item. + + If a bounded capacity was specified when this instance of + was initialized, + a call to may block until space is available to store the provided item. + + + + + Attempts to add the specified item to the . + + The item to be added to the collection. + true if the could be added; otherwise, false. + The has been marked + as complete with regards to additions. + The has been disposed. + The underlying collection didn't accept the item. + + + + Attempts to add the specified item to the . + + The item to be added to the collection. + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + true if the could be added to the collection within + the alloted time; otherwise, false. + The has been marked + as complete with regards to additions. + The has been disposed. + is a negative number + other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater than + . + The underlying collection didn't accept the item. + + + + Attempts to add the specified item to the . + + The item to be added to the collection. + The number of milliseconds to wait, or (-1) to wait indefinitely. + true if the could be added to the collection within + the alloted time; otherwise, false. + The has been marked + as complete with regards to additions. + The has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + The underlying collection didn't accept the item. + + + + Attempts to add the specified item to the . + A is thrown if the is + canceled. + + The item to be added to the collection. + The number of milliseconds to wait, or (-1) to wait indefinitely. + A cancellation token to observe. + true if the could be added to the collection within + the alloted time; otherwise, false. + If the is canceled. + The has been marked + as complete with regards to additions. + The has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + The underlying collection didn't accept the item. + + + Adds an item into the underlying data store using its IProducerConsumerCollection<T>.Add + method. If a bounded capacity was specified and the collection was full, + this method will wait for, at most, the timeout period trying to add the item. + If the timeout period was exhaused before successfully adding the item this method will + return false. + The item to be added to the collection. + The number of milliseconds to wait for the collection to accept the item, + or Timeout.Infinite to wait indefinitely. + A cancellation token to observe. + False if the collection remained full till the timeout period was exhausted.True otherwise. + If the is canceled. + the collection has already been marked + as complete with regards to additions. + If the collection has been disposed. + The underlying collection didn't accept the item. + + + Takes an item from the . + The item removed from the collection. + The is empty and has been marked + as complete with regards to additions. + The has been disposed. + The underlying collection was modified + outside of this instance. + A call to may block until an item is available to be removed. + + + Takes an item from the . + The item removed from the collection. + If the is + canceled or the is empty and has been marked + as complete with regards to additions. + The has been disposed. + The underlying collection was modified + outside of this instance. + A call to may block until an item is available to be removed. + + + + Attempts to remove an item from the . + + The item removed from the collection. + true if an item could be removed; otherwise, false. + The has been disposed. + The underlying collection was modified + outside of this instance. + + + + Attempts to remove an item from the . + + The item removed from the collection. + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + true if an item could be removed from the collection within + the alloted time; otherwise, false. + The has been disposed. + is a negative number + other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater than + . + The underlying collection was modified + outside of this instance. + + + + Attempts to remove an item from the . + + The item removed from the collection. + The number of milliseconds to wait, or (-1) to wait indefinitely. + true if an item could be removed from the collection within + the alloted time; otherwise, false. + The has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + The underlying collection was modified + outside of this instance. + + + + Attempts to remove an item from the . + A is thrown if the is + canceled. + + The item removed from the collection. + The number of milliseconds to wait, or (-1) to wait indefinitely. + A cancellation token to observe. + true if an item could be removed from the collection within + the alloted time; otherwise, false. + If the is canceled. + The has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + The underlying collection was modified + outside of this instance. + + + Takes an item from the underlying data store using its IProducerConsumerCollection<T>.Take + method. If the collection was empty, this method will wait for, at most, the timeout period (if AddingIsCompleted is false) + trying to remove an item. If the timeout period was exhaused before successfully removing an item + this method will return false. + A is thrown if the is + canceled. + + The item removed from the collection. + The number of milliseconds to wait for the collection to have an item available + for removal, or Timeout.Infinite to wait indefinitely. + A cancellation token to observe. + A combined cancellation token if created, it is only created by GetConsumingEnumerable to avoid creating the linked token + multiple times. + False if the collection remained empty till the timeout period was exhausted. True otherwise. + If the is canceled. + If the collection has been disposed. + + + + Adds the specified item to any one of the specified + instances. + + The array of collections. + The item to be added to one of the collections. + The index of the collection in the array to which the item was added. + The argument is + null. + The argument is + a 0-length array or contains a null element, or at least one of collections has been + marked as complete for adding. + At least one of the instances has been disposed. + At least one underlying collection didn't accept the item. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + + If a bounded capacity was specified when all of the + instances were initialized, + a call to AddToAny may block until space is available in one of the collections + to store the provided item. + + + + + Adds the specified item to any one of the specified + instances. + A is thrown if the is + canceled. + + The array of collections. + The item to be added to one of the collections. + A cancellation token to observe. + The index of the collection in the array to which the item was added. + If the is canceled. + The argument is + null. + The argument is + a 0-length array or contains a null element, or at least one of collections has been + marked as complete for adding. + At least one of the instances has been disposed. + At least one underlying collection didn't accept the item. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + + If a bounded capacity was specified when all of the + instances were initialized, + a call to AddToAny may block until space is available in one of the collections + to store the provided item. + + + + + Attempts to add the specified item to any one of the specified + instances. + + The array of collections. + The item to be added to one of the collections. + The index of the collection in the + array to which the item was added, or -1 if the item could not be added. + The argument is + null. + The argument is + a 0-length array or contains a null element, or at least one of collections has been + marked as complete for adding. + At least one of the instances has been disposed. + At least one underlying collection didn't accept the item. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + + + + Attempts to add the specified item to any one of the specified + instances. + + The array of collections. + The item to be added to one of the collections. + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + The index of the collection in the + array to which the item was added, or -1 if the item could not be added. + The argument is + null. + The argument is + a 0-length array or contains a null element, or at least one of collections has been + marked as complete for adding. + At least one of the instances has been disposed. + is a negative number + other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater than + . + At least one underlying collection didn't accept the item. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + + + + Attempts to add the specified item to any one of the specified + instances. + + The array of collections. + The item to be added to one of the collections. + The number of milliseconds to wait, or (-1) to wait indefinitely. /// The index of the collection in the + array to which the item was added, or -1 if the item could not be added. + The argument is + null. + The argument is + a 0-length array or contains a null element, or at least one of collections has been + marked as complete for adding. + At least one of the instances has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + At least one underlying collection didn't accept the item. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + + + + Attempts to add the specified item to any one of the specified + instances. + A is thrown if the is + canceled. + + The array of collections. + The item to be added to one of the collections. + The number of milliseconds to wait, or (-1) to wait indefinitely. /// The index of the collection in the + array to which the item was added, or -1 if the item could not be added. + A cancellation token to observe. + If the is canceled. + The argument is + null. + The argument is + a 0-length array or contains a null element, or at least one of collections has been + marked as complete for adding. + At least one of the instances has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + At least one underlying collection didn't accept the item. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + + + Adds/Takes an item to/from anyone of the specified collections. + A is thrown if the is + canceled. + + The collections into which the item can be added. + The item to be added or the item removed and returned to the caller. + The number of milliseconds to wait for a collection to accept the + operation, or -1 to wait indefinitely. + Indicates whether this method is called to Add or Take. + A cancellation token to observe. + The index into collections for the collection which accepted the + adding/removal of the item; -1 if the item could not be added/removed. + If the is canceled. + If the collections argument is null. + If the collections argument is a 0-length array or contains a + null element. Also, if atleast one of the collections has been marked complete for adds. + If atleast one of the collections has been disposed. + + + + Local static method, used by TryAddTakeAny to get the wait handles for the collection, with exclude option to exclude the Compeleted collections + + The blocking collections + Add or Take operation + The original CancellationToken + True to exclude the compeleted collections + Complete list of cancellationTokens to observe + The collections wait handles + + + + Helper to perform WaitHandle.WaitAny(.., CancellationToken) + this should eventually appear on the WaitHandle class. + + + + + + + + + + Helper function to measure and update the wait time + + The first time (in Ticks) observed when the wait started + The orginal wait timeoutout in milliseconds + The new wait time in milliseconds, -1 if the time expired + + + + Takes an item from any one of the specified + instances. + + The array of collections. + The item removed from one of the collections. + The index of the collection in the array from which + the item was removed, or -1 if an item could not be removed. + The argument is + null. + The argument is + a 0-length array or contains a null element. + At least one of the instances has been disposed. + At least one of the underlying collections was modified + outside of its instance. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + A call to TakeFromAny may block until an item is available to be removed. + + + + Takes an item from any one of the specified + instances. + A is thrown if the is + canceled. + + The array of collections. + The item removed from one of the collections. + A cancellation token to observe. + The index of the collection in the array from which + the item was removed, or -1 if an item could not be removed. + The argument is + null. + If the is canceled. + The argument is + a 0-length array or contains a null element. + At least one of the instances has been disposed. + At least one of the underlying collections was modified + outside of its instance. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + A call to TakeFromAny may block until an item is available to be removed. + + + + Attempts to remove an item from any one of the specified + instances. + + The array of collections. + The item removed from one of the collections. + The index of the collection in the array from which + the item was removed, or -1 if an item could not be removed. + The argument is + null. + The argument is + a 0-length array or contains a null element. + At least one of the instances has been disposed. + At least one of the underlying collections was modified + outside of its instance. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + A call to TryTakeFromAny may block until an item is available to be removed. + + + + Attempts to remove an item from any one of the specified + instances. + + The array of collections. + The item removed from one of the collections. + A that represents the number of milliseconds + to wait, or a that represents -1 milliseconds to wait indefinitely. + + The index of the collection in the array from which + the item was removed, or -1 if an item could not be removed. + The argument is + null. + The argument is + a 0-length array or contains a null element. + At least one of the instances has been disposed. + is a negative number + other than -1 milliseconds, which represents an infinite time-out -or- timeout is greater than + . + At least one of the underlying collections was modified + outside of its instance. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + A call to TryTakeFromAny may block until an item is available to be removed. + + + + Attempts to remove an item from any one of the specified + instances. + + The array of collections. + The item removed from one of the collections. + The number of milliseconds to wait, or (-1) to wait indefinitely. + The index of the collection in the array from which + the item was removed, or -1 if an item could not be removed. + The argument is + null. + The argument is + a 0-length array or contains a null element. + At least one of the instances has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + At least one of the underlying collections was modified + outside of its instance. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + A call to TryTakeFromAny may block until an item is available to be removed. + + + + Attempts to remove an item from any one of the specified + instances. + A is thrown if the is + canceled. + + The array of collections. + The item removed from one of the collections. + The number of milliseconds to wait, or (-1) to wait indefinitely. + A cancellation token to observe. + The index of the collection in the array from which + the item was removed, or -1 if an item could not be removed. + If the is canceled. + The argument is + null. + The argument is + a 0-length array or contains a null element. + At least one of the instances has been disposed. + is a + negative number other than -1, which represents an infinite time-out. + At least one of the underlying collections was modified + outside of its instance. + The count of is greater than the maximum size of + 62 for STA and 63 for MTA. + A call to TryTakeFromAny may block until an item is available to be removed. + + + + Marks the instances + as not accepting any more additions. + + + After a collection has been marked as complete for adding, adding to the collection is not permitted + and attempts to remove from the collection will not wait when the collection is empty. + + The has been disposed. + + + Cancels the semaphores. + + + + Releases resources used by the instance. + + + + + Releases resources used by the instance. + + Whether being disposed explicitly (true) or due to a finalizer (false). + + + Copies the items from the instance into a new array. + An array containing copies of the elements of the collection. + The has been disposed. + + The copied elements are not removed from the collection. + + + + Copies all of the items in the instance + to a compatible one-dimensional array, starting at the specified index of the target array. + + The one-dimensional array that is the destination of the elements copied from + the instance. The array must have zero-based indexing. + The zero-based index in at which copying begins. + The argument is + null. + The argument is less than zero. + The argument is equal to or greater + than the length of the . + The has been disposed. + + + Copies all of the items in the instance + to a compatible one-dimensional array, starting at the specified index of the target array. + + The one-dimensional array that is the destination of the elements copied from + the instance. The array must have zero-based indexing. + The zero-based index in at which copying begins. + The argument is + null. + The argument is less than zero. + The argument is equal to or greater + than the length of the , the array is multidimensional, or the type parameter for the collection + cannot be cast automatically to the type of the destination array. + The has been disposed. + + + Provides a consuming for items in the collection. + An that removes and returns items from the collection. + The has been disposed. + + + Provides a consuming for items in the collection. + Calling MoveNext on the returned enumerable will block if there is no data available, or will + throw an if the is canceled. + + A cancellation token to observe. + An that removes and returns items from the collection. + The has been disposed. + If the is canceled. + + + Provides an for items in the collection. + An for the items in the collection. + The has been disposed. + + + Provides an for items in the collection. + An for the items in the collection. + The has been disposed. + + + Centralizes the logic for validating the BlockingCollections array passed to TryAddToAny() + and TryTakeFromAny(). + The collections to/from which an item should be added/removed. + Indicates whether this method is called to Add or Take. + A copy of the collections array that acts as a defense to prevent an “outsider” from changing + elements of the array after we have done the validation on them. + If the collections argument is null. + If the collections argument is a 0-length array or contains a + null element. Also, if atleast one of the collections has been marked complete for adds. + If atleast one of the collections has been disposed. + + + Centeralizes the logic of validating the timeout input argument. + The TimeSpan to wait for to successfully complete an operation on the collection. + If the number of millseconds represented by the timeout + TimeSpan is less than 0 or is larger than Int32.MaxValue and not Timeout.Infinite + + + Centralizes the logic of validating the millisecondsTimeout input argument. + The number of milliseconds to wait for to successfully complete an + operation on the collection. + If the number of millseconds is less than 0 and not + equal to Timeout.Infinite. + + + Throws a System.ObjectDisposedException if the collection was disposed + If the collection has been disposed. + + + Gets the bounded capacity of this instance. + The bounded capacity of this collection, or int.MaxValue if no bound was supplied. + The has been disposed. + + + Gets whether this has been marked as complete for adding. + Whether this collection has been marked as complete for adding. + The has been disposed. + + + Gets whether this has been marked as complete for adding and is empty. + Whether this collection has been marked as complete for adding and is empty. + The has been disposed. + + + Gets the number of items contained in the . + The number of items contained in the . + The has been disposed. + + + Gets a value indicating whether access to the is synchronized. + The has been disposed. + + + + Gets an object that can be used to synchronize access to the . This property is not supported. + + The SyncRoot property is not supported. + + + An enumerated data type used internal to the class to specify to a generic method + the current mode of operation. + + + A debugger view of the blocking collection that makes it simple to browse the + collection's contents at a point in time. + The type of element that the BlockingCollection will hold. + + + Constructs a new debugger view object for the provided blocking collection object. + A blocking collection to browse in the debugger. + + + Returns a snapshot of the underlying collection's elements. + + + + Represents an thread-safe, unordered collection of objects. + + Specifies the type of elements in the bag. + + + Bags are useful for storing objects when ordering doesn't matter, and unlike sets, bags support + duplicates. is a thread-safe bag implementation, optimized for + scenarios where the same thread will be both producing and consuming data stored in the bag. + + + accepts null reference (Nothing in Visual Basic) as a valid + value for reference types. + + + All public and protected members of are thread-safe and may be used + concurrently from multiple threads. + + + + + + Initializes a new instance of the + class. + + + + + Initializes a new instance of the + class that contains elements copied from the specified collection. + + The collection whose elements are copied to the new . + is a null reference + (Nothing in Visual Basic). + + + + Local helper function to initalize a new bag object + + An enumeration containing items with which to initialize this bag. + + + + Adds an object to the . + + The object to be added to the + . The value can be a null reference + (Nothing in Visual Basic) for reference types. + + + + + + + + + + Attempts to add an object to the . + + The object to be added to the + . The value can be a null reference + (Nothing in Visual Basic) for reference types. + Always returns true + + + + Attempts to remove and return an object from the . + + When this method returns, contains the object + removed from the or the default value + of if the operation failed. + true if an object was removed successfully; otherwise, false. + + + + Attempts to return an object from the + without removing it. + + When this method returns, contains an object from + the or the default value of + if the operation failed. + true if and object was returned successfully; otherwise, false. + + + + Local helper function to Take or Peek an item from the bag + + To receive the item retrieved from the bag + True means Take operation, false means Peek operation + True if succeeded, false otherwise + + + + Local helper function to retrieve a thread local list by a thread object + + Create a new list if the thread does ot exist + The local list object + + + + Try to reuse an unowned list if exist + unowned lists are the lists that their owner threads are aborted or terminated + this is workaround to avoid memory leaks. + + The list object, null if all lists are owned + + + + Local helper method to steal an item from any other non empty thread + It enumerate all other threads in two passes first pass acquire the lock with TryEnter if succeeded + it steals the item, otherwise it enumerate them again in 2nd pass and acquire the lock using Enter + + To receive the item retrieved from the bag + Whether to remove or peek. + True if succeeded, false otherwise. + + + + local helper function tries to steal an item from given local list + + + + + Local helper function to check the list if it became empty after acquiring the lock + and wait if there is unsynchronized Add/Take operation in the list to be done + + The list to steal + True if can steal, false otherwise + + + + Copies the elements to an existing + one-dimensional Array, starting at the specified array + index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + is equal to or greater than the + length of the + -or- the number of elements in the source is greater than the available space from + to the end of the destination . + + + + Copies the elements of the to an , starting at a particular + index. + + The one-dimensional Array that is the + destination of the elements copied from the + . The Array must have zero-based indexing. + The zero-based index in at which copying + begins. + is a null reference (Nothing in + Visual Basic). + is less than + zero. + + is multidimensional. -or- + does not have zero-based indexing. -or- + is equal to or greater than the length of the + -or- The number of elements in the source is + greater than the available space from to the end of the destination + . -or- The type of the source cannot be cast automatically to the type of the + destination . + + + + + Copies the elements to a new array. + + A new array containing a snapshot of elements copied from the . + + + + Returns an enumerator that iterates through the . + + An enumerator for the contents of the . + + The enumeration represents a moment-in-time snapshot of the contents + of the bag. It does not reflect any updates to the collection after + was called. The enumerator is safe to use + concurrently with reads from and writes to the bag. + + + + + Returns an enumerator that iterates through the . + + An enumerator for the contents of the . + + The items enumerated represent a moment-in-time snapshot of the contents + of the bag. It does not reflect any update to the collection after + was called. + + + + + Get the data array to be serialized + + + + + Construct the stack from a previously seiralized one + + + + + Local helper method to freeze all bag operations, it + 1- Acquire the global lock to prevent any other thread to freeze the bag, and also new new thread can be added + to the dictionary + 2- Then Acquire all local lists locks to prevent steal and synchronized operations + 3- Wait for all un-synchronized operations to be done + + Retrieve the lock taken result for the global lock, to be passed to Unfreeze method + + + + Local helper method to unfreeze the bag from a frozen state + + The lock taken result from the Freeze method + + + + local helper method to acquire all local lists locks + + + + + Local helper method to release all local lists locks + + + + + Local helper function to wait all unsynchronized operations + + + + + Local helper function to get the bag count, the caller should call it from Freeze/Unfreeze block + + The current bag count + + + + Local helper function to return the bag item in a list, this is mainly used by CopyTo and ToArray + This is not thread safe, should be called in Freeze/UnFreeze bag block + + List the contains the bag items + + + + Gets the number of elements contained in the . + + The number of elements contained in the . + + The count returned represents a moment-in-time snapshot of the contents + of the bag. It does not reflect any updates to the collection after + was called. + + + + + Gets a value that indicates whether the is empty. + + true if the is empty; otherwise, false. + + + + Gets a value indicating whether access to the is + synchronized with the SyncRoot. + + true if access to the is synchronized + with the SyncRoot; otherwise, false. For , this property always + returns false. + + + + Gets an object that can be used to synchronize access to the . This property is not supported. + + The SyncRoot property is not supported. + + + + A class that represents a node in the lock thread list + + + + + A class that represents the lock thread list + + + + + ThreadLocalList constructor + + The owner thread for this list + + + + Add new item to head of the list + + The item to add. + Whether to update the count. + + + + Remove an item from the head of the list + + The removed item + + + + Peek an item from the head of the list + + the peeked item + True if succeeded, false otherwise + + + + Steal an item from the tail of the list + + the removed item + remove or peek flag + + + + Gets the total list count, it's not thread safe, may provide incorrect count if it is called concurrently + + + + + List operations + + + + + A simple class for the debugger view window + + + + + Provides a set of methods for querying objects that implement + ParallelQuery{TSource}. This is the parallel equivalent of + . + + + + + Enables parallelization of a query. + + The type of elements of . + An + to convert to a . + The source as a to bind to + ParallelEnumerable extension methods. + + is a null reference (Nothing in Visual Basic). + + + + + Enables parallelization of a query, as sourced by a partitioner + responsible for splitting the input sequence into partitions. + + The type of elements of . + A partitioner over the input sequence. + The as a ParallelQuery to bind to ParallelEnumerable extension methods. + + The source partitioner's GetOrderedPartitions method is used when ordering is enabled, + whereas the partitioner's GetPartitions is used if ordering is not enabled (the default). + The source partitioner's GetDynamicPartitions and GetDynamicOrderedPartitions are not used. + + + is a null reference (Nothing in Visual Basic). + + + + + Enables treatment of a data source as if it was ordered, overriding the default of unordered. + AsOrdered may only be invoked on sequences returned by AsParallel, ParallelEnumerable.Range, + and ParallelEnumerable.Repeat. + + The type of elements of . + The input sequence. + + Thrown if is not one of AsParallel, ParallelEnumerable.Range, or ParallelEnumerable.Repeat. + + + is a null reference (Nothing in Visual Basic). + + + A natural tension exists between performance and preserving order in parallel processing. By default, + a parallelized query behaves as if the ordering of the results is arbitrary + unless AsOrdered is applied or there is an explicit OrderBy operator in the query. + + The source sequence which will maintain ordering in the query. + + + + Enables treatment of a data source as if it was ordered, overriding the default of unordered. + AsOrdered may only be invoked on sequences returned by AsParallel, ParallelEnumerable.Range, + and ParallelEnumerable.Repeat. + + The input sequence. + + Thrown if the is not one of AsParallel, ParallelEnumerable.Range, or ParallelEnumerable.Repeat. + + + is a null reference (Nothing in Visual Basic). + + + A natural tension exists between performance and preserving order in parallel processing. By default, + a parallelized query behaves as if the ordering of the results is arbitrary unless AsOrdered + is applied or there is an explicit OrderBy operator in the query. + + The source sequence which will maintain ordering in the query. + + + + Allows an intermediate query to be treated as if no ordering is implied among the elements. + + + AsUnordered may provide + performance benefits when ordering is not required in a portion of a query. + + The type of elements of . + The input sequence. + The source sequence with arbitrary order. + + is a null reference (Nothing in Visual Basic). + + + + + Enables parallelization of a query. + + An to convert + to a . + + The source as a ParallelQuery to bind to + ParallelEnumerable extension methods. + + + is a null reference (Nothing in Visual Basic). + + + + + Converts a into an + to force sequential + evaluation of the query. + + The type of elements of . + A to convert to an . + The source as an + to bind to sequential extension methods. + + is a null reference (Nothing in Visual Basic). + + + + + Sets the task scheduler to execute the query. + + The type of elements of . + A ParallelQuery on which to set the task scheduler option. + Task scheduler to execute the query. + ParallelQuery representing the same query as source, but with the task scheduler option set. + + or is a null reference (Nothing in Visual Basic). + + + WithTaskScheduler is used multiple times in the query. + + + + + Sets the degree of parallelism to use in a query. Degree of parallelism is the maximum number of concurrently + executing tasks that will be used to process the query. + + The type of elements of . + A ParallelQuery on which to set the limit on the degrees of parallelism. + The degree of parallelism for the query. + ParallelQuery representing the same query as source, with the limit on the degrees of parallelism set. + + is a null reference (Nothing in Visual Basic). + + + WithDegreeOfParallelism is used multiple times in the query. + + + is less than 1 or greater than 63. + + + + + Sets the to associate with the query. + + The type of elements of . + A ParallelQuery on which to set the option. + A cancellation token. + ParallelQuery representing the same query as source, but with the + registered. + + is a null reference (Nothing in Visual Basic). + + + WithCancellation is used multiple times in the query. + + + The associated with the has been disposed. + + + + + Sets the execution mode of the query. + + The type of elements of . + A ParallelQuery on which to set the option. + The mode in which to execute the query. + ParallelQuery representing the same query as source, but with the + registered. + + is a null reference (Nothing in Visual Basic). + + + is not a valid value. + + + WithExecutionMode is used multiple times in the query. + + + + + Sets the merge options for this query, which specify how the query will buffer output. + + The type of elements of . + A ParallelQuery on which to set the option. + The merge optiosn to set for this query. + ParallelQuery representing the same query as source, but with the + registered. + + is a null reference (Nothing in Visual Basic). + + + is not a valid value. + + + WithMergeOptions is used multiple times in the query. + + + + + Generates a parallel sequence of integral numbers within a specified range. + + The value of the first integer in the sequence. + The number of sequential integers to generate. + An IEnumerable<Int32> in C# or IEnumerable(Of Int32) in + Visual Basic that contains a range of sequential integral numbers. + + is less than 0 + -or- + + - 1 is larger than . + + + + + Generates a parallel sequence that contains one repeated value. + + The type of the value to be repeated in the result sequence. + The value to be repeated. + The number of times to repeat the value in the generated sequence. + A sequence that contains a repeated value. + + is less than 0. + + + + + Returns an empty ParallelQuery{TResult} that has the specified type argument. + + The type to assign to the type parameter of the returned + generic sequence. + An empty sequence whose type argument is . + + + + Invokes in parallel the specified action for each element in the . + + + This is an efficient way to process the output from a parallelized query because it does + not require a merge step at the end. However, order of execution is non-deterministic. + + The type of elements of . + The whose elements will be processed by + . + An Action to invoke on each element. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Filters in parallel a sequence of values based on a predicate. + + The type of the elements of source. + A sequence to filter. + A function to test each element for a condition. + A sequence that contains elements from the input sequence that satisfy + the condition. + + or is a null reference (Nothing in Visual Basic). + + + + + Filters in parallel a sequence of values based on a predicate. Each element's index is used in the logic of the predicate function. + + The type of the elements of source. + A sequence to filter. + A function to test each element for a condition. + A sequence that contains elements from the input sequence that satisfy the condition. + + or is a null reference (Nothing in Visual Basic). + + + + + Projects in parallel each element of a sequence into a new form. + + The type of the elements of . + The type of elements resturned by selector. + A sequence of values to invoke a transform function on. + A transform function to apply to each element. + A sequence whose elements are the result of invoking the transform function on each + element of . + + or is a null reference (Nothing in Visual Basic). + + + + + Projects in parallel each element of a sequence into a new form by incorporating the element's index. + + The type of the elements of . + The type of elements resturned by selector. + A sequence of values to invoke a transform function on. + A transform function to apply to each element. + A sequence whose elements are the result of invoking the transform function on each + element of . + + or is a null reference (Nothing in Visual Basic). + + + + + Merges in parallel two sequences by using the specified predicate function. + + The type of the elements of the first sequence. + The type of the elements of the second sequence. + The type of the return elements. + The first sequence to zip. + The second sequence to zip. + A function to create a result element from two matching elements. + + A sequence that has elements of type that are obtained by performing + resultSelector pairwise on two sequences. If the sequence lengths are unequal, this truncates + to the length of the shorter sequence. + + + or or is a null reference (Nothing in Visual Basic). + + + + + This Zip overload should never be called. + This method is marked as obsolete and always throws + when invoked. + + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Zip with a left data source of type + and a right data source of type . + Otherwise, the Zip operator would appear to be bind to the parallel implementation, but would in reality bind to the sequential implementation. + + + + + Correlates in parallel the elements of two sequences based on matching keys. + The default equality comparer is used to compare keys. + + The type of the elements of the first sequence. + The type of the elements of the second sequence. + The type of the keys returned by the key selector functions. + The type of the result elements. + The first sequence to join. + The sequence to join to the first sequence. + A function to extract the join key from each element of + the first sequence. + A function to extract the join key from each element of + the second sequence. + A function to create a result element from two matching elements. + A sequence that has elements of type that are obtained by performing + an inner join on two sequences. + + or or or + or is a null reference (Nothing in Visual Basic). + + + + + This Join overload should never be called. + This method is marked as obsolete and always throws when invoked. + + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage Join with a left data source of type + and a right data source of type . + Otherwise, the Join operator would appear to be binding to the parallel implementation, but would in reality bind to the sequential implementation. + + + + + Correlates in parallel the elements of two sequences based on matching keys. + A specified IEqualityComparer{T} is used to compare keys. + + The type of the elements of the first sequence. + The type of the elements of the second sequence. + The type of the keys returned by the key selector functions. + The type of the result elements. + The first sequence to join. + The sequence to join to the first sequence. + A function to extract the join key from each element + of the first sequence. + A function to extract the join key from each element + of the second sequence. + A function to create a result element from two matching elements. + An IEqualityComparer<(Of <(T>)>) to hash and compare keys. + A sequence that has elements of type that are obtained by performing + an inner join on two sequences. + + or or or + or is a null reference (Nothing in Visual Basic). + + + + + This Join overload should never be called. + This method is marked as obsolete and always throws when invoked. + + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Join with a left data source of type + and a right data source of type . + Otherwise, the Join operator would appear to be binding to the parallel implementation, but would in reality bind to the sequential implementation. + + + + + Correlates in parallel the elements of two sequences based on equality of keys and groups the results. + The default equality comparer is used to compare keys. + + The type of the elements of the first sequence. + The type of the elements of the second sequence. + The type of the keys returned by the key selector functions. + The type of the result elements. + The first sequence to join. + The sequence to join to the first sequence. + A function to extract the join key from each element + of the first sequence. + A function to extract the join key from each element + of the second sequence. + A function to create a result element from an element from + the first sequence and a collection of matching elements from the second sequence. + A sequence that has elements of type that are obtained by performing + a grouped join on two sequences. + + or or or + or is a null reference (Nothing in Visual Basic). + + + + + This GroupJoin overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of GroupJoin with a left data source of type + and a right data source of type . + Otherwise, the GroupJoin operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Correlates in parallel the elements of two sequences based on key equality and groups the results. + A specified IEqualityComparer{T} is used to compare keys. + + The type of the elements of the first sequence. + The type of the elements of the second sequence. + The type of the keys returned by the key selector functions. + The type of the result elements. + The first sequence to join. + The sequence to join to the first sequence. + A function to extract the join key from each element + of the first sequence. + A function to extract the join key from each element + of the second sequence. + A function to create a result element from an element from + the first sequence and a collection of matching elements from the second sequence. + An IEqualityComparer<(Of <(T>)>) to hash and compare keys. + A sequence that has elements of type that are obtained by performing + a grouped join on two sequences. + + or or or + or is a null reference (Nothing in Visual Basic). + + + + + This GroupJoin overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of GroupJoin with a left data source of type + and a right data source of type . + Otherwise, the GroupJoin operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Projects in parallel each element of a sequence to an IEnumerable{T} + and flattens the resulting sequences into one sequence. + + The type of elements of . + The type of the elements of the sequence returned by selector. + A sequence of values to project. + A transform function to apply to each element. + A sequence whose elements are the result of invoking the one-to-many transform + function on each element of the input sequence. + + or is a null reference (Nothing in Visual Basic). + + + + + Projects in parallel each element of a sequence to an IEnumerable{T}, and flattens the resulting + sequences into one sequence. The index of each source element is used in the projected form of + that element. + + The type of elements of . + The type of the elements of the sequence returned by selector. + A sequence of values to project. + A transform function to apply to each element. + A sequence whose elements are the result of invoking the one-to-many transform + function on each element of the input sequence. + + or is a null reference (Nothing in Visual Basic). + + + + + Projects each element of a sequence to an IEnumerable{T}, + flattens the resulting sequences into one sequence, and invokes a result selector + function on each element therein. + + The type of elements of . + The type of the intermediate elements collected by . + + A sequence of values to project. + A transform function to apply to each source element; + the second parameter of the function represents the index of the source element. + A function to create a result element from an element from + the first sequence and a collection of matching elements from the second sequence. + A sequence whose elements are the result of invoking the one-to-many transform + function on each element of and then mapping + each of those sequence elements and their corresponding source element to a result element. + + or or + is a null reference (Nothing in Visual Basic). + + + + + Projects each element of a sequence to an IEnumerable{T}, flattens the resulting + sequences into one sequence, and invokes a result selector function on each element + therein. The index of each source element is used in the intermediate projected + form of that element. + + The type of elements of . + The type of the intermediate elements collected by + . + The type of elements to return. + A sequence of values to project. + A transform function to apply to each source element; + the second parameter of the function represents the index of the source element. + A function to create a result element from an element from + the first sequence and a collection of matching elements from the second sequence. + + A sequence whose elements are the result of invoking the one-to-many transform + function on each element of and then mapping + each of those sequence elements and their corresponding source element to a + result element. + + + or or + is a null reference (Nothing in Visual Basic). + + + + + Sorts in parallel the elements of a sequence in ascending order according to a key. + + + In contrast to the sequential implementation, this is not a stable sort. + To achieve a stable sort, change a query of the form: + var ordered = source.OrderBy((e) => e.k); + to instead be formed as: + var ordered = source.Select((e,i) => new { E=e, I=i }).OrderBy((v) => v.i).Select((v) => v.e); + + The type of elements of . + The type of the key returned by . + A sequence of values to order. + A function to extract a key from an element. + An OrderedParallelQuery{TSource} whose elements are sorted + according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Sorts in parallel the elements of a sequence in ascending order by using a specified comparer. + + + In contrast to the sequential implementation, this is not a stable sort. + See the remarks for OrderBy(ParallelQuery{TSource}, Func{TSource,TKey}) for + an approach to implementing a stable sort. + + The type of elements of . + The type of the key returned by . + A sequence of values to order. + A function to extract a key from an element. + An IComparer{TKey} to compare keys. + An OrderedParallelQuery{TSource} whose elements are sorted according + to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Sorts in parallel the elements of a sequence in descending order according to a key. + + + In contrast to the sequential implementation, this is not a stable sort. + See the remarks for OrderBy(ParallelQuery{TSource}, Func{TSource,TKey}) for + an approach to implementing a stable sort. + + The type of elements of . + The type of the key returned by . + A sequence of values to order. + A function to extract a key from an element. + An OrderedParallelQuery{TSource} whose elements are sorted + descending according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Sorts the elements of a sequence in descending order by using a specified comparer. + + + In contrast to the sequential implementation, this is not a stable sort. + See the remarks for OrderBy(ParallelQuery{TSource}, Func{TSource,TKey}) for + an approach to implementing a stable sort. + + The type of elements of . + The type of the key returned by . + A sequence of values to order. + A function to extract a key from an element. + An IComparer{TKey} to compare keys. + An OrderedParallelQuery{TSource} whose elements are sorted descending + according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Performs in parallel a subsequent ordering of the elements in a sequence + in ascending order according to a key. + + + In contrast to the sequential implementation, this is not a stable sort. + See the remarks for OrderBy(ParallelQuery{TSource}, Func{TSource,TKey}) for + an approach to implementing a stable sort. + + The type of elements of . + The type of the key returned by . + An OrderedParallelQuery{TSource} than + contains elements to sort. + A function to extract a key from an element. + An OrderedParallelQuery{TSource} whose elements are + sorted according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Performs in parallel a subsequent ordering of the elements in a sequence in + ascending order by using a specified comparer. + + + In contrast to the sequential implementation, this is not a stable sort. + See the remarks for OrderBy(ParallelQuery{TSource}, Func{TSource,TKey}) for + an approach to implementing a stable sort. + + The type of elements of . + The type of the key returned by . + An OrderedParallelQuery{TSource} that contains + elements to sort. + A function to extract a key from an element. + An IComparer{TKey} to compare keys. + An OrderedParallelQuery{TSource} whose elements are sorted + according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Performs in parallel a subsequent ordering of the elements in a sequence in + descending order, according to a key. + + + In contrast to the sequential implementation, this is not a stable sort. + See the remarks for OrderBy(ParallelQuery{TSource}, Func{TSource,TKey}) for + an approach to implementing a stable sort. + + The type of elements of . + The type of the key returned by . + An OrderedParallelQuery{TSource} than contains + elements to sort. + A function to extract a key from an element. + An OrderedParallelQuery{TSource} whose elements are sorted + descending according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Performs in parallel a subsequent ordering of the elements in a sequence in descending + order by using a specified comparer. + + + In contrast to the sequential implementation, this is not a stable sort. + See the remarks for OrderBy(ParallelQuery{TSource}, Func{TSource,TKey}) for + an approach to implementing a stable sort. + + The type of elements of . + The type of the key returned by . + An OrderedParallelQuery{TSource} than contains + elements to sort. + A function to extract a key from an element. + An IComparer{TKey} to compare keys. + An OrderedParallelQuery{TSource} whose elements are sorted + descending according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Groups in parallel the elements of a sequence according to a specified key selector function. + + The type of elements of . + The type of the key returned by . + An OrderedParallelQuery{TSource}than contains + elements to sort. + A function to extract a key from an element. + An OrderedParallelQuery{TSource}whose elements are sorted + descending according to a key. + + + + Groups in parallel the elements of a sequence according to a specified key selector function and compares the keys by using a specified comparer. + + The type of elements of . + The type of the key returned by >. + An OrderedParallelQuery{TSource} than contains + elements to sort. + A function to extract a key from an element. + An IComparer{TSource} to compare keys. + An OrderedParallelQuery{TSource} whose elements are sorted + descending according to a key. + + or is a null reference (Nothing in Visual Basic). + + + + + Groups in parallel the elements of a sequence according to a specified key selector function and + projects the elements for each group by using a specified function. + + The type of elements of . + The type of the key returned by . + The type of the elements in the IGrouping + An OrderedParallelQuery<(Of <(TElement>)>) than contains + elements to sort. + A function to extract a key from an element. + A function to map each source element to an element in an IGrouping. + A ParallelQuery<IGrouping<TKey, TElement>> in C# or + ParallelQuery(Of IGrouping(Of TKey, TElement)) in Visual Basic where each IGrouping + generic object contains a collection of objects of type and a key. + + or or + is a null reference (Nothing in Visual Basic). + + + + + Groups in parallel the elements of a sequence according to a key selector function. + The keys are compared by using a comparer and each group's elements are projected by + using a specified function. + + The type of elements of . + The type of the key returned by . + The type of the elements in the IGrouping + An OrderedParallelQuery{TSource}than contains elements to sort. + A function to extract a key from an element. + A function to map each source element to an element in an IGrouping. + An IComparer{TSource} to compare keys. + + A ParallelQuery{IGrouping{TKey, TElement}} in C# or + ParallelQuery(Of IGrouping(Of TKey, TElement)) in Visual Basic where each IGrouping + generic object contains a collection of objects of type and a key. + + + or or + is a null reference (Nothing in Visual Basic). + + + + + Groups in parallel the elements of a sequence according to a specified + key selector function and creates a result value from each group and its key. + + The type of the elements of . + The type of the key returned by . + The type of the result value returned by . + A sequence whose elements to group. + A function to extract the key for each element. + A function to create a result value from each group. + A collection of elements of type where each element represents a + projection over a group and its key. + + or or + is a null reference (Nothing in Visual Basic). + + + + + Groups in parallel the elements of a sequence according to a specified key selector function + and creates a result value from each group and its key. The keys are compared + by using a specified comparer. + + The type of the elements of . + The type of the key returned by . + The type of the result value returned by . + A sequence whose elements to group. + A function to extract the key for each element. + A function to create a result value from each group. + An IEqualityComparer{TKey} to compare keys. + + An ParallelQuery<IGrouping<TKey, TResult>> in C# or + ParallelQuery(Of IGrouping(Of TKey, TResult)) in Visual Basic where each + IGrouping<(Of <(TKey, TResult>)>) object contains a collection of objects + of type and a key. + + + or or + is a null reference (Nothing in Visual Basic). + + + + + Groups in parallel the elements of a sequence according to a specified key + selector function and creates a result value from each group and its key. + The elements of each group are projected by using a specified function. + + The type of the elements of . + The type of the key returned by . + The type of the elements in each + IGrouping{TKey, TElement}. + The type of the result value returned by . + A sequence whose elements to group. + A function to extract the key for each element. + A function to map each source element to an element in an + IGrouping<TKey, TElement>. + A function to create a result value from each group. + A collection of elements of type where each element represents a + projection over a group and its key. + + or or + or is a null reference (Nothing in Visual Basic). + + + + + Groups the elements of a sequence according to a specified key selector function and + creates a result value from each group and its key. Key values are compared by using a + specified comparer, and the elements of each group are projected by using a specified function. + + The type of the elements of . + The type of the key returned by . + The type of the elements in each + IGrouping{TKey, TElement}. + The type of the result value returned by . + A sequence whose elements to group. + A function to extract the key for each element. + A function to map each source element to an element in an + IGrouping{Key, TElement}. + A function to create a result value from each group. + An IEqualityComparer{TKey} to compare keys. + A collection of elements of type where each element represents a + projection over a group and its key. + + or or + or is a null reference (Nothing in Visual Basic). + + + + + Run an aggregation sequentially. If the user-provided reduction function throws an exception, wrap + it with an AggregateException. + + + + + if true, use the seed provided in the method argument + if false, use the first element of the sequence as the seed instead + + + + + + Applies in parallel an accumulator function over a sequence. + + The type of the elements of . + A sequence to aggregate over. + An accumulator function to be invoked on each element. + The final accumulator value. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Applies in parallel an accumulator function over a sequence. + The specified seed value is used as the initial accumulator value. + + The type of the elements of . + The type of the accumulator value. + A sequence to aggregate over. + The initial accumulator value. + An accumulator function to be invoked on each element. + The final accumulator value. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Applies in parallel an accumulator function over a sequence. The specified + seed value is used as the initial accumulator value, and the specified + function is used to select the result value. + + The type of the elements of . + The type of the accumulator value. + The type of the resulting value. + A sequence to aggregate over. + The initial accumulator value. + An accumulator function to be invoked on each element. + A function to transform the final accumulator value + into the result value. + The transformed final accumulator value. + + or or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Applies in parallel an accumulator function over a sequence. This overload is not + available in the sequential implementation. + + + This overload is specific to processing a parallelized query. A parallelized query may + partition the data source sequence into several sub-sequences (partitions). + The is invoked on each element within partitions. + Each partition then yields a single accumulated result. The + is then invoked on the results of each partition to yield a single element. This element is then + transformed by the function. + + The type of the elements of . + The type of the accumulator value. + The type of the resulting value. + A sequence to aggregate over. + The initial accumulator value. + + An accumulator function to be invoked on each element in a partition. + + + An accumulator function to be invoked on the yielded element from each partition. + + + A function to transform the final accumulator value into the result value. + + The transformed final accumulator value. + + or + or or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Applies in parallel an accumulator function over a sequence. This overload is not + available in the sequential implementation. + + + This overload is specific to parallelized queries. A parallelized query may partition the data source sequence + into several sub-sequences (partitions). The is invoked + on each element within partitions. Each partition then yields a single accumulated result. + The + is then invoked on the results of each partition to yield a single element. This element is then + transformed by the function. + + The type of the elements of . + The type of the accumulator value. + The type of the resulting value. + A sequence to aggregate over. + + A function that returns the initial accumulator value. + + + An accumulator function to be invoked on each element in a partition. + + + An accumulator function to be invoked on the yielded element from each partition. + + + A function to transform the final accumulator value into the result value. + + The transformed final accumulator value. + + or or + or or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the number of elements in a parallel sequence. + + The type of the elements of . + A sequence that contains elements to be counted. + The number of elements in the input sequence. + + is a null reference (Nothing in Visual Basic). + + + The number of elements in source is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns a number that represents how many elements in the specified + parallel sequence satisfy a condition. + + The type of the elements of . + A sequence that contains elements to be counted. + A function to test each element for a condition. + + A number that represents how many elements in the sequence satisfy the condition + in the predicate function. + + + or is a null reference (Nothing in Visual Basic). + + + The number of elements in source is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns an Int64 that represents the total number of elements in a parallel sequence. + + The type of the elements of . + A sequence that contains elements to be counted. + The number of elements in the input sequence. + + is a null reference (Nothing in Visual Basic). + + + The number of elements in source is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns an Int64 that represents how many elements in a parallel sequence satisfy a condition. + + The type of the elements of . + A sequence that contains elements to be counted. + A function to test each element for a condition. + + A number that represents how many elements in the sequence satisfy the condition + in the predicate function. + + + or is a null reference (Nothing in Visual Basic). + + + The number of elements in source is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of a sequence of values. + + A sequence of values to calculate the sum of. + The sum of the values in the sequence. + + is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the sum of the sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values to calculate the sum of. + A transform function to apply to each element. + The sum of the values in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + The sum is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the minimum value in a parallel sequence of values. + + The type of elements of . + A sequence of values to determine the minimum value of. + The minimum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements and is a non-nullable value type. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the minimum value. + + The type of elements of . + The type of the value returned by . + A sequence of values to determine the minimum value of. + A transform function to apply to each element. + The minimum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements and is a non-nullable value type. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the maximum value in a parallel sequence of values. + + A sequence of values to determine the maximum value of. + The maximum value in the sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements and is a non-nullable value type. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Invokes in parallel a transform function on each element of a + sequence and returns the maximum value. + + The type of elements of . + The type of the value returned by . + A sequence of values to determine the maximum value of. + A transform function to apply to each element. + The maximum value in the sequence. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements and is a non-nullable value type. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values. + + A sequence of values that are used to calculate an average. + The average of the sequence of values. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + The sum or count of the elements in the sequence is larger than . + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Computes in parallel the average of a sequence of values that are obtained + by invoking a transform function on each element of the input sequence. + + The type of elements of . + A sequence of values that are used to calculate an average. + A transform function to apply to each element. + The average of the sequence of values. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Determines in parallel whether any element of a sequence satisfies a condition. + + The type of elements of . + An IEnumerable whose elements to apply the predicate to. + A function to test each element for a condition. + + true if any elements in the source sequence pass the test in the specified predicate; otherwise, false. + + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Determines whether a parallel sequence contains any elements. + + The type of elements of . + The IEnumerable to check for emptiness. + true if the source sequence contains any elements; otherwise, false. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Determines in parallel whether all elements of a sequence satisfy a condition. + + The type of elements of . + A sequence whose elements to apply the predicate to. + A function to test each element for a condition. + + true if all elements in the source sequence pass the test in the specified predicate; otherwise, false. + + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Determines in parallel whether a sequence contains a specified element + by using the default equality comparer. + + The type of elements of . + A sequence in which to locate a value. + The value to locate in the sequence. + + true if the source sequence contains an element that has the specified value; otherwise, false. + + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Determines in parallel whether a sequence contains a specified element by using a + specified IEqualityComparer{T}. + + The type of elements of . + A sequence in which to locate a value. + The value to locate in the sequence. + An equality comparer to compare values. + + true if the source sequence contains an element that has the specified value; otherwise, false. + + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns a specified number of contiguous elements from the start of a parallel sequence. + + The type of elements of . + The sequence to return elements from. + The number of elements to return. + + A sequence that contains the specified number of elements from the start of the input sequence. + + + is a null reference (Nothing in Visual Basic). + + + + + Returns elements from a parallel sequence as long as a specified condition is true. + + The type of elements of . + The sequence to return elements from. + A function to test each element for a condition. + + A sequence that contains the elements from the input sequence that occur before + the element at which the test no longer passes. + + + or is a null reference (Nothing in Visual Basic). + + + + + Returns elements from a parallel sequence as long as a specified condition is true. + The element's index is used in the logic of the predicate function. + + The type of elements of . + The sequence to return elements from. + + A function to test each source element for a condition; the second parameter of the + function represents the index of the source element. + + + A sequence that contains elements from the input sequence that occur before + the element at which the test no longer passes. + + + or is a null reference (Nothing in Visual Basic). + + + + + Bypasses a specified number of elements in a parallel sequence and then returns the remaining elements. + + The type of elements of . + The sequence to return elements from. + The number of elements to skip before returning the remaining elements. + + A sequence that contains the elements that occur after the specified index in the input sequence. + + + is a null reference (Nothing in Visual Basic). + + + + + Bypasses elements in a parallel sequence as long as a specified + condition is true and then returns the remaining elements. + + The type of elements of . + The sequence to return elements from. + A function to test each element for a condition. + A sequence that contains the elements from the input sequence starting at + the first element in the linear series that does not pass the test specified by + predicate. + + or is a null reference (Nothing in Visual Basic). + + + + + Bypasses elements in a parallel sequence as long as a specified condition is true and + then returns the remaining elements. The element's index is used in the logic of + the predicate function. + + The type of elements of . + The sequence to return elements from. + + A function to test each source element for a condition; the + second parameter of the function represents the index of the source element. + + + A sequence that contains the elements from the input sequence starting at the + first element in the linear series that does not pass the test specified by + predicate. + + + or is a null reference (Nothing in Visual Basic). + + + + + Concatenates two parallel sequences. + + The type of the elements of the input sequences. + The first sequence to concatenate. + The sequence to concatenate to the first sequence. + A sequence that contains the concatenated elements of the two input sequences. + + or is a null reference (Nothing in Visual Basic). + + + + + This Concat overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Concat with a left data source of type + and a right data source of type . + Otherwise, the Concat operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Determines whether two parallel sequences are equal by comparing the elements by using + the default equality comparer for their type. + + The type of the elements of the input sequences. + A sequence to compare to second. + A sequence to compare to the first input sequence. + + true if the two source sequences are of equal length and their corresponding elements + are equal according to the default equality comparer for their type; otherwise, false. + + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + This SequenceEqual overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + Thrown every time this method is called. + + This overload exists to disallow usage of SequenceEqual with a left data source of type + and a right data source of type . + Otherwise, the SequenceEqual operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Determines whether two parallel sequences are equal by comparing their elements by + using a specified IEqualityComparer{T}. + + The type of the elements of the input sequences. + A sequence to compare to . + A sequence to compare to the first input sequence. + An IEqualityComparer<(Of <(T>)>) to use to compare elements. + + true if the two source sequences are of equal length and their corresponding + elements are equal according to the default equality comparer for their type; otherwise, false. + + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + A helper method for SequenceEqual to dispose an enumerator. If an exception is thrown by the disposal, + it gets wrapped into an AggregateException, unless it is an OCE with the query's CancellationToken. + + + + + This SequenceEqual overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + Thrown every time this method is called. + + This overload exists to disallow usage of SequenceEqual with a left data source of type + and a right data source of type . + Otherwise, the SequenceEqual operator would appear to be binding to the parallel implementation, + but would in reality bind to sequential implementation. + + + + + Returns distinct elements from a parallel sequence by using the + default equality comparer to compare values. + + The type of the elements of . + The sequence to remove duplicate elements from. + A sequence that contains distinct elements from the source sequence. + + is a null reference (Nothing in Visual Basic). + + + + + Returns distinct elements from a parallel sequence by using a specified + IEqualityComparer{T} to compare values. + + The type of the elements of . + The sequence to remove duplicate elements from. + An IEqualityComparer<(Of <(T>)>) to compare values. + A sequence that contains distinct elements from the source sequence. + + is a null reference (Nothing in Visual Basic). + + + + + Produces the set union of two parallel sequences by using the default equality comparer. + + The type of the elements of the input sequences. + A sequence whose distinct elements form the first set for the union. + A sequence whose distinct elements form the second set for the union. + A sequence that contains the elements from both input sequences, excluding duplicates. + + or is a null reference (Nothing in Visual Basic). + + + + + This Union overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Union with a left data source of type + and a right data source of type . + Otherwise, the Union operator would appear to be binding to the parallel implementation, + but would in reality bind to sequential implementation. + + + + + Produces the set union of two parallel sequences by using a specified IEqualityComparer{T}. + + The type of the elements of the input sequences. + A sequence whose distinct elements form the first set for the union. + A sequence whose distinct elements form the second set for the union. + An IEqualityComparer<(Of <(T>)>) to compare values. + A sequence that contains the elements from both input sequences, excluding duplicates. + + or is a null reference (Nothing in Visual Basic). + + + + + This Union overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Union with a left data source of type + and a right data source of type . + Otherwise, the Union operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Produces the set intersection of two parallel sequences by using the + default equality comparer to compare values. + + The type of the elements of the input sequences. + A sequence whose distinct elements that also appear in will be returned. + + + A sequence whose distinct elements that also appear in the first sequence will be returned. + + A sequence that contains the elements that form the set intersection of two sequences. + + or is a null reference (Nothing in Visual Basic). + + + + + This Intersect overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Intersect with a left data source of type + and a right data source of type . + Otherwise, the Intersect operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Produces the set intersection of two parallel sequences by using + the specified IEqualityComparer{T} to compare values. + + The type of the elements of the input sequences. + + A sequence whose distinct elements that also appear in will be returned. + + + A sequence whose distinct elements that also appear in the first sequence will be returned. + + An IEqualityComparer<(Of <(T>)>) to compare values. + A sequence that contains the elements that form the set intersection of two sequences. + + or is a null reference (Nothing in Visual Basic). + + + + + This Intersect overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Intersect with a left data source of type + and a right data source of type . + Otherwise, the Intersect operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Produces the set difference of two parallel sequences by using + the default equality comparer to compare values. + + The type of the elements of the input sequences. + + A sequence whose elements that are not also in will be returned. + + + A sequence whose elements that also occur in the first sequence will cause those + elements to be removed from the returned sequence. + + A sequence that contains the set difference of the elements of two sequences. + + or is a null reference (Nothing in Visual Basic). + + + + + This Except overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Except with a left data source of type + and a right data source of type . + Otherwise, the Except operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Produces the set difference of two parallel sequences by using the + specified IEqualityComparer{T} to compare values. + + The type of the elements of the input sequences. + A sequence whose elements that are not also in will be returned. + + A sequence whose elements that also occur in the first sequence will cause those elements + to be removed from the returned sequence. + + An IEqualityComparer<(Of <(T>)>) to compare values. + A sequence that contains the set difference of the elements of two sequences. + + or is a null reference (Nothing in Visual Basic). + + + + + This Except overload should never be called. + This method is marked as obsolete and always throws when called. + + This type parameter is not used. + This parameter is not used. + This parameter is not used. + This parameter is not used. + This overload always throws a . + The exception that occurs when this method is called. + + This overload exists to disallow usage of Except with a left data source of type + and a right data source of type . + Otherwise, the Except operator would appear to be binding to the parallel implementation, + but would in reality bind to the sequential implementation. + + + + + Converts a into an + to force sequential + evaluation of the query. + + The type of the elements of . + The sequence to type as . + The input sequence types as . + + is a null reference (Nothing in Visual Basic). + + + + + Creates an array from a ParallelQuery{T}. + + The type of the elements of . + A sequence to create an array from. + An array that contains the elements from the input sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates a List{T} from an ParallelQuery{T}. + + The type of the elements of . + A sequence to create a List<(Of <(T>)>) from. + A List<(Of <(T>)>) that contains elements from the input sequence. + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates a Dictionary{TKey,TValue} from a ParallelQuery{T} according to + a specified key selector function. + + The type of the elements of . + The type of the key returned by . + A sequence to create a Dictionary<(Of <(TKey, TValue>)>) from. + A function to extract a key from each element. + A Dictionary<(Of <(TKey, TValue>)>) that contains keys and values. + + or is a null reference (Nothing in Visual Basic). + + + produces a key that is a null reference (Nothing in Visual Basic). + -or- + produces duplicate keys for two elements. + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates a Dictionary{TKey,TValue} from a ParallelQuery{T} according to a + specified key selector function and key comparer. + + The type of the elements of . + The type of the key returned by . + A sequence to create a Dictionary<(Of <(TKey, TValue>)>) from. + A function to extract a key from each element. + An IEqualityComparer<(Of <(T>)>) to compare keys. + A Dictionary<(Of <(TKey, TValue>)>) that contains keys and values. + + or is a null reference (Nothing in Visual Basic). + + + produces a key that is a null reference (Nothing in Visual Basic). + -or- + produces duplicate keys for two elements. + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates a Dictionary{TKey,TValue} from a ParallelQuery{T} according to specified + key selector and element selector functions. + + The type of the elements of . + The type of the key returned by . + The type of the value returned by . + A sequence to create a Dictionary<(Of <(TKey, TValue>)>) from. + A function to extract a key from each element. + + A transform function to produce a result element value from each element. + + + A Dictionary<(Of <(TKey, TValue>)>) that contains values of type + selected from the input sequence + + + or or is a null reference (Nothing in Visual Basic). + + + produces a key that is a null reference (Nothing in Visual Basic). + -or- + produces duplicate keys for two elements. + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates a Dictionary{TKey,TValue from a ParallelQuery{T} according to a + specified key selector function, a comparer, and an element selector function. + + The type of the elements of . + The type of the key returned by . + The type of the value returned by . + A sequence to create a Dictionary<(Of <(TKey, TValue>)>) from. + A function to extract a key from each element. + A transform function to produce a result element + value from each element. + An IEqualityComparer<(Of <(T>)>) to compare keys. + + A Dictionary<(Of <(TKey, TValue>)>) that contains values of type + selected from the input sequence + + + or or is a null reference (Nothing in Visual Basic). + + + produces a key that is a null reference (Nothing in Visual Basic). + -or- + produces duplicate keys for two elements. + -or- + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates an ILookup{TKey,T} from a ParallelQuery{T} according to a specified key selector function. + + The type of elements of . + The type of the key returned by . + The sequence to create a Lookup<(Of <(TKey, TElement>)>) from. + A function to extract a key from each element. + A Lookup<(Of <(TKey, TElement>)>) that contains keys and values. + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates an ILookup{TKey,T} from a ParallelQuery{T} according to a specified + key selector function and key comparer. + + The type of elements of . + The type of the key returned by . + The sequence to create a Lookup<(Of <(TKey, TElement>)>) from. + A function to extract a key from each element. + An IEqualityComparer<(Of <(T>)>) to compare keys. + A Lookup<(Of <(TKey, TElement>)>) that contains keys and values. + + or or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates an ILookup{TKey,TElement} from a ParallelQuery{T} according to specified + key selector and element selector functions. + + The type of elements of . + The type of the key returned by . + The type of the value returned by . + The sequence to create a Lookup<(Of <(TKey, TElement>)>) from. + A function to extract a key from each element. + + A transform function to produce a result element value from each element. + + + A Lookup<(Of <(TKey, TElement>)>) that contains values of type TElement + selected from the input sequence. + + + or or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Creates an ILookup{TKey,TElement} from a ParallelQuery{T} according to + a specified key selector function, a comparer and an element selector function. + + The type of elements of . + The type of the key returned by . + The type of the value returned by . + The sequence to create a Lookup<(Of <(TKey, TElement>)>) from. + A function to extract a key from each element. + + A transform function to produce a result element value from each element. + + An IEqualityComparer<(Of <(T>)>) to compare keys. + + A Lookup<(Of <(TKey, TElement>)>) that contains values of type TElement selected + from the input sequence. + + + or or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Inverts the order of the elements in a parallel sequence. + + The type of the elements of . + A sequence of values to reverse. + A sequence whose elements correspond to those of the input sequence in reverse order. + + is a null reference (Nothing in Visual Basic). + + + + + Filters the elements of a ParallelQuery based on a specified type. + + The type to filter the elements of the sequence on. + The sequence whose elements to filter. + A sequence that contains elements from the input sequence of type . + + is a null reference (Nothing in Visual Basic). + + + + + Converts the elements of a ParallelQuery to the specified type. + + The type to convert the elements of to. + The sequence that contains the elements to be converted. + + A sequence that contains each element of the source sequence converted to the specified type. + + + is a null reference (Nothing in Visual Basic). + + + + + Returns the first element of a parallel sequence. + The type of the elements of . + The sequence to return the first element of. + The first element in the specified sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the first element in a parallel sequence that satisfies a specified condition. + + There's a temporary difference from LINQ to Objects, this does not throw + ArgumentNullException when the predicate is null. + The type of the elements of . + The sequence to return an element from. + A function to test each element for a condition. + The first element in the sequence that passes the test in the specified predicate function. + + or is a null reference (Nothing in Visual Basic). + + + No element in satisfies the condition in . + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the first element of a parallel sequence, or a default value if the + sequence contains no elements. + + The type of the elements of . + The sequence to return the first element of. + + default(TSource) if is empty; otherwise, the first element in . + + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the first element of the parallel sequence that satisfies a condition or a + default value if no such element is found. + + There's a temporary difference from LINQ to Objects, this does not throw + ArgumentNullException when the predicate is null. + The type of the elements of . + The sequence to return an element from. + A function to test each element for a condition. + + default(TSource) if is empty or if no element passes the test + specified by predicate; otherwise, the first element in that + passes the test specified by predicate. + + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the last element of a parallel sequence. + The type of the elements of . + The sequence to return the last element from. + The value at the last position in the source sequence. + + is a null reference (Nothing in Visual Basic). + + + contains no elements. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the last element of a parallel sequence that satisfies a specified condition. + + The type of the elements of . + The sequence to return an element from. + A function to test each element for a condition. + + The last element in the sequence that passes the test in the specified predicate function. + + + or is a null reference (Nothing in Visual Basic). + + + No element in satisfies the condition in . + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the last element of a parallel sequence, or a default value if the + sequence contains no elements. + + The type of the elements of . + The sequence to return an element from. + + default() if the source sequence is empty; otherwise, the last element in the sequence. + + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the last element of a parallel sequence that satisfies a condition, or + a default value if no such element is found. + + The type of the elements of . + The sequence to return an element from. + A function to test each element for a condition. + + default() if the sequence is empty or if no elements pass the test in the + predicate function; otherwise, the last element that passes the test in the predicate function. + + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the only element of a parallel sequence, and throws an exception if there is not + exactly one element in the sequence. + + The type of the elements of . + The sequence to return the single element of. + The single element of the input sequence. + + is a null reference (Nothing in Visual Basic). + + + The input sequence contains more than one element. -or- The input sequence is empty. + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the only element of a parallel sequence that satisfies a specified condition, + and throws an exception if more than one such element exists. + + The type of the elements of . + The sequence to return the single element of. + A function to test an element for a condition. + The single element of the input sequence that satisfies a condition. + + or is a null reference (Nothing in Visual Basic). + + + No element satisfies the condition in . -or- More than one element satisfies the condition in . + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the only element of a parallel sequence, or a default value if the sequence is + empty; this method throws an exception if there is more than one element in the sequence. + + The type of the elements of . + The sequence to return the single element of. + + The single element of the input sequence, or default() if the + sequence contains no elements. + + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the only element of a parallel sequence that satisfies a specified condition + or a default value if no such element exists; this method throws an exception + if more than one element satisfies the condition. + + The type of the elements of . + The sequence to return the single element of. + A function to test an element for a condition. + + The single element of the input sequence that satisfies the condition, or + default() if no such element is found. + + + or is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the elements of the specified parallel sequence or the type parameter's + default value in a singleton collection if the sequence is empty. + + The type of the elements of . + The sequence to return a default value for if it is empty. + + A sequence that contains default(TSource) if is empty; otherwise, . + + + is a null reference (Nothing in Visual Basic). + + + + + Returns the elements of the specified parallel sequence or the specified value + in a singleton collection if the sequence is empty. + + The type of the elements of . + The sequence to return the specified value for if it is empty. + The value to return if the sequence is empty. + + A sequence that contains defaultValue if is empty; otherwise, . + + + is a null reference (Nothing in Visual Basic). + + + + + Returns the element at a specified index in a parallel sequence. + + The type of the elements of . + A sequence to return an element from. + The zero-based index of the element to retrieve. + The element at the specified position in the source sequence. + + is a null reference (Nothing in Visual Basic). + + + is less than 0 or greater than or equal to the number of elements in . + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Returns the element at a specified index in a parallel sequence or a default value if the + index is out of range. + + The type of the elements of . + A sequence to return an element from. + The zero-based index of the element to retrieve. + + default(TSource) if the index is outside the bounds of the source sequence; + otherwise, the element at the specified position in the source sequence. + + + is a null reference (Nothing in Visual Basic). + + + One or more exceptions occurred during the evaluation of the query. + + + The query was canceled. + + + + + Specifies the preferred type of output merge to use in a query. This is a hint only, and may not be + respected by the system when parallelizing all queries. + + + + Use NotBuffered for queries that will be consumed and output as streams, this has the lowest latency + between beginning query execution and elements being yielded. For some queries, such as those involving a + sort (OrderBy, OrderByDescending), buffering is essential and a hint of NotBuffered or AutoBuffered will + be ignored. + + + Use AutoBuffered for most cases; this is the default. It strikes a balance between latency and + overall performance. + + + Use FullyBuffered for queries when the entire output can be processed before the information is + needed. This option offers the best performance when all of the output can be accumulated before yielding + any information, though it is not suitable for stream processing or showing partial results mid-query. + + + + + + Use the default merge type, which is AutoBuffered. + + + + + Use a merge without output buffers. As soon as result elements have been computed, + make that element available to the consumer of the query. + + + + + Use a merge with output buffers of a size chosen by the system. Results + will accumulate into an output buffer before they are available to the consumer of + the query. + + + + + Use a merge with full output buffers. The system will accumulate all of the + results before making any of them available to the consumer of the query. + + + + + This is a bounded channel meant for single-producer/single-consumer scenarios. + + Specifies the type of data in the channel. + + + + The simplest channel is one that has no synchronization. This is used for stop- + and-go productions where we are guaranteed the consumer is not running + concurrently. It just wraps a FIFO queue internally. + + Assumptions: + Producers and consumers never try to enqueue/dequeue concurrently. + + + + + + We occassionally need a no-op enumerator to stand-in when we don't have data left + within a partition's data stream. These are simple enumerable and enumerator + implementations that always and consistently yield no elements. + + + + + + Represents a parallel sequence. + + + + + Represents a parallel sequence. + + + + + Returns an enumerator that iterates through the sequence. + + An enumerator that iterates through the sequence. + + + + Returns an enumerator that iterates through the sequence. + + An enumerator that iterates through the sequence. + + + + A common enumerator type that unifies all query operator enumerators. + + + + + + + A simple implementation of the IEnumerable{object} interface which wraps + a weakly typed IEnumerable object, allowing it to be accessed as a strongly typed + IEnumerable{object}. + + + + + + An interface that allows developers to specify their own partitioning routines. + + + + + + + A simple implementation of the ParallelQuery{object} interface which wraps an + underlying IEnumerable, such that it can be used in parallel queries. + + + + + A simple implementation of the ParallelQuery{T} interface which wraps an + underlying IEnumerable{T}, such that it can be used in parallel queries. + + + + + + An enum to specify whether an aggregate operator is associative, commutative, + neither, or both. This influences query analysis and execution: associative + aggregations can run in parallel, whereas non-associative cannot; non-commutative + aggregations must be run over data in input-order. + + + + + A simple enumerable type that implements the range algorithm. It also supports + partitioning of the indices by implementing an interface that PLINQ recognizes. + + + + + A simple enumerable type that implements the repeat algorithm. It also supports + partitioning of the count space by implementing an interface that PLINQ recognizes. + + + + + + A special merge helper for indexible queries. Given an indexible query, we know how many elements + we'll have in the result set, so we can allocate the array ahead of time. Then, as each result element + is produced, we can directly insert it into the appropriate position in the output array, paying + no extra cost for ordering. + + + + + + Used as a stand-in for replaceable merge algorithms. Alternative implementations + are chosen based on the style of merge required. + + + + + + Instantiates the array merge helper. + + The query settings + The query results + + + + A method used as a delegate passed into the ForAll operator + + + + + Schedules execution of the merge itself. + + + + + Gets the enumerator over the results. + + We never expect this method to be called. ArrayMergeHelper is intended to be used when we want + to consume the results using GetResultsAsArray(). + + + + + Returns the merged results as an array. + + + + + + An enumerator that merges multiple one-to-one channels into a single output + stream, including any necessary blocking and synchronization. This is an + asynchronous enumerator, i.e. the producers may be inserting items into the + channels concurrently with the consumer taking items out of them. Therefore, + enumerating this object can cause the current thread to block. + + We use a biased choice algorithm to choose from our consumer channels. I.e. we + will prefer to process elements in a fair round-robin fashion, but will + occassionally bypass this if a channel is empty. + + + + + + + Convenience class used by enumerators that merge many partitions into one. + + + + + + WaitAny simulates a Win32-style WaitAny on the set of thin-events. + + An array of thin-events (null elements permitted) + The index of the specific event in events that caused us to wake up. + + + + The default merge helper uses a set of straightforward algorithms for output + merging. Namely, for synchronous merges, the input data is yielded from the + input data streams in "depth first" left-to-right order. For asynchronous merges, + on the other hand, we use a biased choice algorithm to favor input channels in + a "fair" way. No order preservation is carried out by this helper. + + + + + + + Drives execution of an actual merge operation, including creating channel data + structures and scheduling parallel work as appropriate. The algorithms used + internally are parameterized based on the type of data in the partitions; e.g. + if an order preserved stream is found, the merge will automatically use an + order preserving merge, and so forth. + + + + + + The order preserving merge helper guarantees the output stream is in a specific order. This is done + by comparing keys from a set of already-sorted input partitions, and coalescing output data using + incremental key comparisons. + + + + + + + A merge helper that yields results in a streaming fashion, while still ensuring correct output + ordering. This merge only works if each producer task generates outputs in the correct order, + i.e. with an Increasing (or Correct) order index. + + The merge creates DOP producer tasks, each of which will be writing results into a separate + buffer. + + The consumer always waits until each producer buffer contains at least one element. If we don't + have one element from each producer, we cannot yield the next element. (If the order index is + Correct, or in some special cases with the Increasing order, we could yield sooner. The + current algorithm does not take advantage of this.) + + The consumer maintains a producer heap, and uses it to decide which producer should yield the next output + result. After yielding an element from a particular producer, the consumer will take another element + from the same producer. However, if the producer buffer exceeded a particular threshold, the consumer + will take the entire buffer, and give the producer an empty buffer to fill. + + Finally, if the producer notices that its buffer has exceeded an even greater threshold, it will + go to sleep and wait until the consumer takes the entire buffer. + + + + + The initial capacity of the buffer queue. The value was chosen experimentally. + + + + + If the consumer notices that the queue reached this limit, it will take the entire buffer from + the producer, instead of just popping off one result. The value was chosen experimentally. + + + + + If the producer notices that the queue reached this limit, it will go to sleep until woken up + by the consumer. Chosen experimentally. + + + + + Whether the producer is allowed to buffer up elements before handing a chunk to the consumer. + If false, the producer will make each result available to the consumer immediately after it is + produced. + + + + + Buffers for the results. Each buffer has elements added by one producer, and removed + by the consumer. + + + + + Whether each producer is done producing. Set to true by individual producers, read by consumer. + + + + + Whether a particular producer is waiting on the consumer. Read by the consumer, set to true + by producers, set to false by the consumer. + + + + + Whether the consumer is waiting on a particular producer. Read by producers, set to true + by consumer, set to false by producer. + + + + + Each object is a lock protecting the corresponding elements in m_buffers, m_producerDone, + m_producerWaiting and m_consumerWaiting. + + + + + A singleton instance of the comparer used by the producer heap. Eager allocation is OK + because if the static constructor runs, we will be using this merge. + + + + + A structure to represent a producer in the producer heap. + + + + + A comparer used by FixedMaxHeap(Of Producer) + + This comparer will be used by max-heap. We want the producer with the smallest MaxKey to + end up in the root of the heap. + + x.MaxKey GREATER_THAN y.MaxKey => x LESS_THAN y => return - + x.MaxKey EQUALS y.MaxKey => x EQUALS y => return 0 + x.MaxKey LESS_THAN y.MaxKey => x GREATER_THAN y => return + + + + + + Enumerator over the results of an order-preserving pipelining merge. + + + + + Merge helper associated with this enumerator + + + + + Heap used to efficiently locate the producer whose result should be consumed next. + For each producer, stores the order index for the next element to be yielded. + + Read and written by the consumer only. + + + + + Stores the next element to be yielded from each producer. We use a separate array + rather than storing this information in the producer heap to keep the Producer struct + small. + + Read and written by the consumer only. + + + + + A private buffer for the consumer. When the size of a producer buffer exceeds a threshold + (STEAL_BUFFER_SIZE), the consumer will take ownership of the entire buffer, and give the + producer a new empty buffer to place results into. + + Read and written by the consumer only. + + + + + Tracks whether MoveNext() has already been called previously. + + + + + Constructor + + + + + Moves the enumerator to the next result, or returns false if there are no more results to yield. + + + + + If the cancellation of the query has been initiated (because one or more producers + encountered exceptions, or because external cancellation token has been set), the method + will tear down the query and rethrow the exception. + + + + + Wait until a producer's buffer is non-empty, or until that producer is done. + + false if there is no element to yield because the producer is done, true otherwise + + + + Looks for an element from a particular producer in the consumer's private buffer. + + + + + Returns the current result + + + + + This enumerator merges multiple input channels into a single output stream. The merging process just + goes from left-to-right, enumerating each channel in succession in its entirety. + Assumptions: + Before enumerating this object, all producers for all channels must have finished enqueueing new + elements. + + + + + + This enumerator handles the actual coordination among partitions required to + accomplish the repartitioning operation, as explained above. + + The kind of elements. + The key used to distribute elements. + The kind of keys found in the source (ignored). + + + + A repartitioning stream must take input data that has already been partitioned and + redistribute its contents based on a new partitioning algorithm. This is accomplished + by making each partition p responsible for redistributing its input data to the + correct destination partition. Some input elements may remain in p, but many will now + belong to a different partition and will need to move. This requires a great deal of + synchronization, but allows threads to repartition data incrementally and in parallel. + Each partition will "pull" data on-demand instead of partitions "pushing" data, which + allows us to reduce some amount of synchronization overhead. + + We currently only offer one form of reparitioning via hashing. This used to be an + abstract base class, but we have eliminated that to get rid of some virtual calls on + hot code paths. Uses a key selection algorithm with mod'ding to determine destination. + + @TODO: @BUG#519: consider adding a bound to the buffers. Unfortunately this can quite easily + lead to deadlock when multiple repartitions are involved. Need a solution. + @TODO: @BUG#504: consider amortizing synchronization overhead by enqueueing/dequeueing in chunks + rather than single elements. Also need to be careful not to introduce deadlock. + + + + + + + + A partitioned stream just partitions some data source using an extensible + partitioning algorithm and exposes a set of N enumerators that are consumed by + their ordinal index [0..N). It is used to build up a set of streaming computations. + At instantiation time, the actual data source to be partitioned is supplied; and + then the caller will layer on top additional enumerators to represent phases in the + computation. Eventually, a merge can then schedule enumeration of all of the + individual partitions in parallel by obtaining references to the individual + partition streams. + + This type has a set of subclasses which implement different partitioning algorithms, + allowing us to easily plug in different partitioning techniques as needed. The type + supports wrapping IEnumerables and IEnumerators alike, with some preference for the + former as many partitioning algorithms are more intelligent for certain data types. + + + + + + + IPartitionedStreamRecipient is essentially a generic action on a partitioned stream, + whose generic type parameter is the type of the order keys in the partitioned stream. + + + + + + This enumerator handles the actual coordination among partitions required to + accomplish the repartitioning operation, as explained above. In addition to that, + it tracks order keys so that order preservation can flow through the enumerator. + + The kind of elements. + The key used to distribute elements. + The kind of keys found in the source. + + + + Contiguous range chunk partitioning attempts to improve data locality by keeping + data close together in the incoming data stream together in the outgoing partitions. + There are really three types of partitions that are used internally: + + 1. If the data source is indexable--like an array or List_T--we can actually + just compute the range indexes and avoid doing any copying whatsoever. Each + "partition" is just an enumerator that will walk some subset of the data. + 2. If the data source has an index (different than being indexable!), we can + turn this into a range scan of the index. We can roughly estimate distribution + and ensure an evenly balanced set of partitions. + @TODO: @BUG#516: we don't have indexes today. We are considering it for the future. + 3. If we can't use 1 or 2, we instead partition "on demand" by chunking the contents + of the source enumerator as they are requested. The unfortunate thing is that + this requires synchronization, since consumers may be running in parallel. We + amortize the cost of this by giving chunks of items when requested instead of + one element at a time. Note that this approach also works for infinite streams. + + In all cases, the caller can request that enumerators walk elements in striped + contiguous chunks. If striping is requested, then each partition j will yield elements + in the data source for which ((i / s)%p) == j, where i is the element's index, s is + a chunk size calculated by the system with the intent of aligning on cache lines, and + p is the number of partitions. If striping is not requested, we use the same algorith, + only, instead of aligning on cache lines, we use a chunk size of l / p, where l + is the length of the input and p is the number of partitions. + + Notes: + This is used as the default partitioning strategy by much of the PLINQ infrastructure. + + + + + + The aggregation operator is a little unique, in that the enumerators it returns + yield intermediate results instead of the final results. That's because there is + one last Aggregate operation that must occur in order to perform the final reduction + over the intermediate streams. In other words, the intermediate enumerators produced + by this operator are never seen by other query operators or consumers directly. + + An aggregation performs parallel prefixing internally. Given a binary operator O, + it will generate intermediate results by folding O across partitions; then it + performs a final reduction by folding O accross the intermediate results. The + analysis engine knows about associativity and commutativity, and will ensure the + style of partitioning inserted into the tree is compatable with the operator. + + For instance, say O is + (meaning it is AC), our input is {1,2,...,8}, and we + use 4 partitions to calculate the aggregation. Sequentially this would look + like this O(O(O(1,2),...),8), in other words ((1+2)+...)+8. The parallel prefix + of this (w/ 4 partitions) instead calculates the intermediate aggregations, i.e.: + t1 = O(1,2), t2 = O(3,4), ... t4 = O(7,8), aka t1 = 1+2, t2 = 3+4, t4 = 7+8. + The final step is to aggregate O over these intermediaries, i.e. + O(O(O(t1,t2),t3),t4), or ((t1+t2)+t3)+t4. This generalizes to any binary operator. + + Beause some aggregations use a different input, intermediate, and output types, + we support an even more generalized aggregation type. In this model, we have + three operators, an intermediate (used for the incremental aggregations), a + final (used for the final summary of intermediate results), and a result selector + (used to perform whatever transformation is needed on the final summary). + + + + + + + + The base class from which all binary query operators derive, that is, those that + have two child operators. This introduces some convenience methods for those + classes, as well as any state common to all subclasses. + + + + + + + This is the abstract base class for all query operators in the system. It + implements the ParallelQuery{T} type so that it can be bound as the source + of parallel queries and so that it can be returned as the result of parallel query + operations. Not much is in here, although it does serve as the "entry point" for + opening all query operators: it will lazily analyze and cache a plan the first + time the tree is opened, and will open the tree upon calls to GetEnumerator. + + Notes: + This class implements ParallelQuery so that any parallel query operator + can bind to the parallel query provider overloads. This allows us to string + together operators w/out the user always specifying AsParallel, e.g. + Select(Where(..., ...), ...), and so forth. + + + + + + The QueryResults{T} is a class representing the results of the query. There may + be different ways the query results can be manipulated. Currently, two ways are + supported: + + 1. Open the query results as a partitioned stream by calling GivePartitionedStream + and pass a generic action as an argument. + + 2. Access individual elements of the results list by calling GetElement(index) and + ElementsCount. This method of accessing the query results is available only if + IsIndexible return true. + + + + + + A QueryOperator that represents the output of the query partitioner.AsParallel(). + + + + + Determines the OrdinalIndexState for a partitioner + + + + + QueryResults for a PartitionerQueryOperator + + + + + Enumerator that converts an enumerator over key-value pairs exposed by a partitioner + to a QueryOperatorEnumerator used by PLINQ internally. + + + + + Enumerator that converts an enumerator over key-value pairs exposed by a partitioner + to a QueryOperatorEnumerator used by PLINQ internally. + + + + + A scan is just a simple operator that is positioned directly on top of some + real data source. It's really just a place holder used during execution and + analysis -- it should never actually get opened. + + + + + + Operator that yields the elements from the first data source that aren't in the second. + This is known as the set relative complement, i.e. left - right. + + + + + + The base class from which all binary query operators derive, that is, those that + have two child operators. This introduces some convenience methods for those + classes, as well as any state common to all subclasses. + + + + + + + + A group join operator takes a left query tree and a right query tree, and then yields + the matching elements between the two. This can be used for outer joins, i.e. those + where an outer element has no matching inner elements -- the result is just an empty + list. As with the join algorithm above, we currently use a hash join algorithm. + + + + + + + + + This enumerator implements the hash-join algorithm as noted earlier. + + Assumptions: + This enumerator type won't work properly at all if the analysis engine didn't + ensure a proper hash-partition. We expect inner and outer elements with equal + keys are ALWAYS in the same partition. If they aren't (e.g. if the analysis is + busted) we'll silently drop items on the floor. :( + + + This is the enumerator class for two operators: + - Join + - GroupJoin + + + + + + + + + + Operator that yields the intersection of two data sources. + + + + + + A join operator takes a left query tree and a right query tree, and then yields the + matching pairs between the two. LINQ supports equi-key-based joins. Hence, a key- + selection function for the left and right data types will yield keys of the same + type for both. We then merely have to match elements from the left with elements from + the right that have the same exact key. Note that this is an inner join. In other + words, outer elements with no matching inner elements do not appear in the output. + + @TODO: @BUG#528: Currently we implement only a hash-join algorithm. Furthermore, we always + choose the inner data source for the hash-table creation. There is room for + optimization and different algorithm choices eventually. + + Hash-joins work in two phases: + + (1) Building - we build a hash-table from one of the data sources. In the case + of this specific operator, the table is built from the hash-codes of + keys selected via the key selector function. Because elements may share + the same key, the table must support one-key-to-many-values. + (2) Probing - for each element in the data source not used for building, we + use its key to look into the hash-table. If we find elements under this + key, we just enumerate all of them, yielding them as join matches. + + Because hash-tables exhibit on average O(1) lookup, we turn what would have been + an O(n*m) algorithm -- in the case of nested loops joins -- into an O(n) algorithm. + We of course require some additional storage to do so, but in general this pays. + + + + + + + + + Operator that yields the union of two data sources. + + + + + + A Zip operator combines two input data sources into a single output stream, + using a pairwise element matching algorithm. For example, the result of zipping + two vectors a = {0, 1, 2, 3} and b = {9, 8, 7, 6} is the vector of pairs, + c = {(0,9), (1,8), (2,7), (3,6)}. Because the expectation is that each element + is matched with the element in the other data source at the same ordinal + position, the zip operator requires order preservation. + + + + + + + + Partitioned stream recipient that will merge the results. + + + + + A wrapper enumerator that just opens the query operator when MoveNext() is called for the + first time. We use QueryOpeningEnumerator to call QueryOperator.GetOpenedEnumerator() + lazily because once GetOpenedEnumerator() is called, PLINQ starts precomputing the + results of the query. + + + + + Opens the query and initializes m_openedQueryEnumerator and m_querySettings. + Called from the first MoveNext call. + + + + + An inlined count aggregation and its enumerator. + + + + + + This class is common to all of the "inlined" versions of various aggregations. The + inlined operators ensure that real MSIL instructions are used to perform elementary + operations versus general purpose delegate-based binary operators. For obvious reasons + this is a quite bit more efficient, although it does lead to a fair bit of unfortunate + code duplication. + + + + + + + + A class with some shared implementation between all aggregation enumerators. + + + + + + An inlined average aggregation operator and its enumerator, for decimals. + + + + + An inlined min/max aggregation and its enumerator, for decimals. + + + + + An inlined sum aggregation and its enumerator, for decimals. + + + + + An inlined average aggregation operator and its enumerator, for doubles. + + + + + An inlined min/max aggregation and its enumerator, for doubles. + + Notes: + Note that normally double.NaN < anything is false, as is anything < NaN. This would + lead to some strangeness in Min and Max, e.g. Min({ NaN, 5.0 } == NaN, yet + Min({ 5.0, NaN }) == 5.0! We impose a total ordering so that NaN is smaller than + everything, including -infinity, which is consistent with Comparer_T. + + + + + An inlined sum aggregation and its enumerator, for doubles. + + + + + An inlined average aggregation operator and its enumerator, for floats. + + + + + An inlined min/max aggregation and its enumerator, for floats. + + + + + An inlined sum aggregation and its enumerator, for floats. + + + + + An inlined average aggregation operator and its enumerator, for ints. + + + + + An inlined min/max aggregation and its enumerator, for ints. + + + + + Inlined aggregations for summing up primitives (int, long, float, double, decimal), as + well as the nullable versions of each (int?, long?, float?, double?, decimal?). + + + + + An inlined average aggregation operator and its enumerator, for longs. + + + + + An inlined count aggregation and its enumerator. + + + + + + An inlined min/max aggregation and its enumerator, for longs. + + + + + An inlined sum aggregation and its enumerator, for longs. + + + + + An inlined average aggregation operator and its enumerator, for Nullable decimals. + + + + + An inlined min/max aggregation and its enumerator, for Nullable decimals. + + + + + An inlined sum aggregation and its enumerator, for nullable decimals. + + + + + An inlined average aggregation operator and its enumerator, for Nullable doubles. + + + + + An inlined min/max aggregation and its enumerator, for Nullable{Double}s. + + Notes: + Note that normally double.NaN < anything is false, as is anything < NaN. This would + lead to some strangeness in Min and Max, e.g. Min({ NaN, 5.0 } == NaN, yet + Min({ 5.0, NaN }) == 5.0! We impose a total ordering so that NaN is smaller than + everything, including -infinity, which is consistent with Comparer_T. + + + + + An inlined sum aggregation and its enumerator, for nullable doubles. + + + + + An inlined average aggregation operator and its enumerator, for Nullable floats. + + + + + An inlined min/max aggregation and its enumerator, for Nullable floats. + + Notes: + Note that normally float.NaN < anything is false, as is anything < NaN. This would + lead to some strangeness in Min and Max, e.g. Min({ NaN, 5.0 } == NaN, yet + Min({ 5.0, NaN }) == 5.0! We impose a total ordering so that NaN is smaller than + everything, including -infinity, which is consistent with Comparer_T. + + + + + An inlined sum aggregation and its enumerator, for Nullable floats. + + + + + An inlined average aggregation operator and its enumerator, for Nullable ints. + + + + + An inlined min/max aggregation and its enumerator, for Nullable ints. + + + + + An inlined sum aggregation and its enumerator, for Nullable ints. + + + + + An inlined average aggregation operator and its enumerator, for Nullable longs. + + + + + An inlined min/max aggregation and its enumerator, for Nullable{Int64}s. + + + + + An inlined sum aggregation and its enumerator, for Nullable longs. + + + + + Class to represent an IList{T} as QueryResults{T} + + + + + + Describes the state of order preservation index associated with an enumerator. + + + + + This type contains query execution options specified by the user. + QuerySettings are used as follows: + - in the query construction phase, some settings may be uninitialized. + - at the start of the query opening phase, the WithDefaults method + is used to initialize all uninitialized settings. + - in the rest of the query opening phase, we assume that all settings + have been initialized. + + + + + Represents operators AsOrdered and AsUnordered. In the current implementation, it + simply turns on preservation globally in the query. + + + + + + Represents operators that set various query execution options. + + + + + + The any/all operators work the same way. They search for the occurrence of a predicate + value in the data source, and upon the first occurrence of such a value, yield a + particular value. Specifically: + + - Any returns true if the predicate for any element evaluates to true. + - All returns false if the predicate for any element evaluates to false. + + This uniformity is used to apply a general purpose algorithm. Both sentences above + take the form of "returns XXX if the predicate for any element evaluates to XXX." + Therefore, we just parameterize on XXX, called the qualifciation below, and if we + ever find an occurrence of XXX in the input data source, we also return XXX. Otherwise, + we return !XXX. Obviously, XXX in this case is a bool. + + This is a search algorithm. So once any single partition finds an element, it will + return so that execution can stop. This is done with a "cancelation" flag that is + polled by all parallel workers. The first worker to find an answer sets it, and all + other workers notice it and quit as quickly as possible. + + + + + + Concatenates one data source with another. Order preservation is used to ensure + the output is actually a concatenation -- i.e. one after the other. The only + special synchronization required is to find the largest index N in the first data + source so that the indices of elements in the second data source can be offset + by adding N+1. This makes it appear to the order preservation infrastructure as + though all elements in the second came after all elements in the first, which is + precisely what we want. + + + + + + Contains is quite similar to the any/all operator above. Each partition searches a + subset of elements for a match, and the first one to find a match signals to the rest + of the partititons to stop searching. + + + + + + This operator just exposes elements directly from the underlying data source, if + it's not empty, or yields a single default element if the data source is empty. + There is a minimal amount of synchronization at the beginning, until all partitions + have registered whether their stream is empty or not. Once the 0th partition knows + that at least one other partition is non-empty, it may proceed. Otherwise, it is + the 0th partition which yields the default value. + + + + + + This operator yields all of the distinct elements in a single data set. It works quite + like the above set operations, with the obvious difference being that it only accepts + a single data source as input. + + + + + + ElementAt just retrieves an element at a specific index. There is some cross-partition + coordination to force partitions to stop looking once a partition has found the + sought-after element. + + + + + + Executes the query, either sequentially or in parallel, depending on the query execution mode and + whether a premature merge was inserted by this ElementAt operator. + + result + withDefaultValue + whether an element with this index exists + + + + First tries to discover the first element in the source, optionally matching a + predicate. All partitions search in parallel, publish the lowest index for a + candidate match, and reach a barrier. Only the partition that "wins" the race, + i.e. who found the candidate with the smallest index, will yield an element. + + + + + + A forall operator just enables an action to be placed at the "top" of a query tree + instead of yielding an enumerator that some consumer can walk. We execute the + query for effect instead of yielding a data result. + + + + + + The operator type for GroupBy statements. This operator groups the input based on + a key-selection routine, yielding one-to-many values of key-to-elements. The + implementation is very much like the hash join operator, in which we first build + a big hashtable of the input; then we just iterate over each unique key in the + hashtable, yielding it plus all of the elements with the same key. + + + + + + + + An ordered version of the grouping data structure. Represents an ordered group of elements that + have the same grouping key. + + + + + Constructs a new grouping + + + + + Add an element + + + + + No more elements will be added, so we can sort the group now. + + + + + The key this grouping represents. + + + + + A variant of the Select operator that supplies element index while performing the + projection operation. This requires cooperation with partitioning and merging to + guarantee ordering is preserved. + + @TODO: @PERF: @BUG#527: as an optimization, we strictly don't need order to be preserved + all the way until the merge. If ordering is only kept for THIS operator, we + can subsequently get rid of order preservation after executing. + + + + + + + A variant of the Where operator that supplies element index while performing the + filtering operation. This requires cooperation with partitioning and merging to + guarantee ordering is preserved. + + @TODO: @PERF: @BUG#527: as an optimization, we strictly don't need order to be preserved + all the way until the merge. If ordering is only kept for THIS operator, we + can subsequently get rid of order preservation after executing. + + + + + + Last tries to discover the last element in the source, optionally matching a + predicate. All partitions search in parallel, publish the greatest index for a + candidate match, and reach a barrier. Only the partition that "wins" the race, + i.e. who found the candidate with the largest index, will yield an element. + + @TODO: @PERF: @BUG#414: this traverses the data source in forward-order. In the future, we + will want to traverse in reverse order, since this allows partitions to stop + the search sooner (by watching if the current index passes below the current best). + + + + + + + Reverse imposes ordinal order preservation. There are normally two phases to this + operator's execution. Each partition first builds a buffer containing all of its + elements, and then proceeds to yielding the elements in reverse. There is a + 'barrier' (but not a blocking barrier) in between these two steps, at which point the largest index becomes + known. This is necessary so that when elements from the buffer are yielded, the + CurrentIndex can be reported as the largest index minus the original index (thereby + reversing the indices as well as the elements themselves). If the largest index is + known a priori, because we have an array for example, we can avoid the barrier in + between the steps. + + + + + + SelectMany is effectively a nested loops join. It is given two data sources, an + outer and an inner -- actually, the inner is sometimes calculated by invoking a + function for each outer element -- and we walk the outer, walking the entire + inner enumerator for each outer element. There is an optional result selector + function which can transform the output before yielding it as a result element. + + Notes: + Although select many takes two enumerable objects as input, it appears to the + query analysis infrastructure as a unary operator. That's because it works a + little differently than the other binary operators: it has to re-open the right + child every time an outer element is walked. The right child is NOT partitioned. + + + + + + + + A helper method for WrapPartitionedStream. We use the helper to reuse a block of code twice, but with + a different order key type. (If premature merge occured, the order key type will be "int". Otherwise, + it will be the same type as "TLeftKey" in WrapPartitionedStream.) + + + + + Similar helper method to WrapPartitionedStreamNotIndexed, except that this one is for the indexed variant + of SelectMany (i.e., the SelectMany that passes indices into the user sequence-generating delegate) + + + + + The operator type for Select statements. This operator transforms elements as it + enumerates them through the use of a selector delegate. + + + + + + + Single searches the input to find the sole element that satisfies the (optional) + predicate. If multiple such elements are found, the caller is responsible for + producing an error. There is some degree of cross-partition synchronization to + proactively hault the search if we ever determine there are multiple elements + satisfying the search in the input. + + + + + + The query operator for OrderBy and ThenBy. + + + + + + + Take and Skip either take or skip a specified number of elements, captured in the + count argument. These will work a little bit like TakeWhile and SkipWhile: there + are two phases, (1) Search and (2) Yield. In the search phase, our goal is to + find the 'count'th index from the input. We do this in parallel by sharing a count- + sized array. Each thread races to populate the array with indices in ascending + order. This requires synchronization for inserts. We use a simple heap, for decent + worst case performance. After a thread has scanned ‘count’ elements, or its current + index is greater than or equal to the maximum index in the array (and the array is + fully populated), the thread can stop searching. All threads issue a barrier before + moving to the Yield phase. When the Yield phase is entered, the count-1th element + of the array contains: in the case of Take, the maximum index (exclusive) to be + returned; or in the case of Skip, the minimum index (inclusive) to be returned. The + Yield phase simply consists of yielding these elements as output. + + + + + + Determines the order index state for the output operator + + + + + Take- and SkipWhile work similarly. Execution is broken into two phases: Search + and Yield. + + During the Search phase, many partitions at once search for the first occurrence + of a false element. As they search, any time a partition finds a false element + whose index is lesser than the current lowest-known false element, the new index + will be published, so other partitions can stop the search. The search stops + as soon as (1) a partition exhausts its input, (2) the predicate yields false for + one of the partition's elements, or (3) its input index passes the current lowest- + known index (sufficient since a given partition's indices are always strictly + incrementing -- asserted below). Elements are buffered during this process. + + Partitions use a barrier after Search and before moving on to Yield. Once all + have passed the barrier, Yielding begins. At this point, the lowest-known false + index will be accurate for the entire set, since all partitions have finished + scanning. This is where TakeWhile and SkipWhile differ. TakeWhile will start at + the beginning of its buffer and yield all elements whose indices are less than + the lowest-known false index. SkipWhile, on the other hand, will skipp any such + elements in the buffer, yielding those whose index is greater than or equal to + the lowest-known false index, and then finish yielding any remaining elements in + its data source (since it may have stopped prematurely due to (3) above). + + + + + + Determines the order index state for the output operator + + + + + The operator type for Where statements. This operator filters out elements that + don't match a filter function (supplied at instantiation time). + + + + + + Poll frequency (number of loops per cancellation check) for situations where per-1-loop testing is too high an overhead. + + + + + Throws an OCE if the merged token has been canceled. + + A token to check for cancelation. + + + + A spooling task handles marshaling data from a producer to a consumer. It simply + takes data from a producer and hands it off to a consumer. This class is the base + class from which other concrete spooling tasks derive, encapsulating some common + logic (such as capturing exceptions). + + + + + Simple abstract task representation, allowing either synchronous and asynchronous + execution. Subclasses override the Work API to implement the logic. + + + + + The number of elements to accumulate on the producer before copying the elements to the + producer-consumer buffer. This constant is only used in the AutoBuffered mode. + + Experimentally, 16 appears to be sufficient buffer size to compensate for the synchronization + cost. + + + + + Whether the producer is allowed to buffer up elements before handing a chunk to the consumer. + If false, the producer will make each result available to the consumer immediately after it is + produced. + + + + + Constructor + + + + + This method is responsible for enumerating results and enqueueing them to + the output buffer as appropriate. Each base class implements its own. + + + + + Creates and begins execution of a new set of spooling tasks. + + + + + Dispose the underlying enumerator and wake up the consumer if necessary. + + + + + A spooling task handles marshaling data from a producer to a consumer. It's given + a single enumerator object that contains all of the production algorithms, a single + destination channel from which consumers draw results, and (optionally) a + synchronization primitive using which to notify asynchronous consumers. This + particular task variant preserves sort order in the final data. + + + + + + + A collection of tasks used by a single query instance. This type also offers some + convenient methods for tracing significant ETW events, waiting on tasks, propagating + exceptions, and performing cancellation activities. + + + + + A factory class to execute spooling logic. + + + + + A spooling task handles marshaling data from a producer to a consumer. It's given + a single enumerator object that contains all of the production algorithms, a single + destination channel from which consumers draw results, and (optionally) a + synchronization primitive using which to notify asynchronous consumers. + + + + + + + A spooling task handles marshaling data from a producer to a consumer. It's given + a single enumerator object that contains all of the production algorithms, a single + destination channel from which consumers draw results, and (optionally) a + synchronization primitive using which to notify asynchronous consumers. + + + + + + + A spooling task handles marshaling data from a producer to a consumer. It's given + a single enumerator object that contains all of the production algorithms, a single + destination channel from which consumers draw results, and (optionally) a + synchronization primitive using which to notify asynchronous consumers. + + + + + + + Wraps an enumerable with a cancellation checker. The enumerator handed out by the source enumerable + will be wrapped by an object that periodically checks whether a particular cancellation token has + been cancelled. If so, the next call to MoveNext() will throw an OperationCancelledException. + + + + + WrapEnumerable.ExceptionAggregator wraps the enumerable with another enumerator that will + catch exceptions, and wrap each with an AggregateException. + + If PLINQ decides to execute a query sequentially, we will reuse LINQ-to-objects + implementations for the different operators. However, we still need to throw + AggregateException in the cases when parallel execution would have thrown an + AggregateException. Thus, we introduce a wrapper enumerator that catches exceptions + and wraps them with an AggregateException. + + + + + A variant of WrapEnumerable that accepts a QueryOperatorEnumerator{,} instead of an IEnumerable{}. + The code duplication is necessary to avoid extra virtual method calls that would otherwise be needed to + convert the QueryOperatorEnumerator{,} to an IEnumerator{}. + + + + + Accepts an exception, wraps it as if it was crossing the parallel->sequential boundary, and throws the + wrapped exception. In sequential fallback cases, we use this method to throw exceptions that are consistent + with exceptions thrown by PLINQ when the query is executed by worker tasks. + + The exception will be wrapped into an AggregateException, except for the case when the query is being + legitimately cancelled, in which case we will propagate the CancellationException with the appropriate + token. + + + + + Wraps a function with a try/catch that morphs all exceptions into AggregateException. + + The input argument type. + The return value type. + A function to use internally. + The cancellation state to use. + A new function containing exception wrapping logic. + + + + ExchangeUtilities is a static class that contains helper functions to partition and merge + streams. + + + + + Used during hash partitioning, when the keys being memoized are not used for anything. + + + + + Very simple heap data structure, of fixed size. + + + + + + A growing array. Unlike List{T}, it makes the internal array available to its user. + + + + + + A simple hash map data structure, derived from the LINQ set we also use. + + The kind of keys contained within. + The kind of values contained within. + + + + A linked list of array chunks. Allows direct access to its arrays. + + The elements held within. + + + + Allocates a new root chunk of a particular size. + + + + + Adds an element to this chunk. Only ever called on the root. + + The new element. + + + + Fetches an enumerator to walk the elements in all chunks rooted from this one. + + + + + The next chunk in the linked chain. + + + + + The number of elements contained within this particular chunk. + + + + + Lookup class implements the ILookup interface. Lookup is very similar to a dictionary + except multiple values are allowed to map to the same key, and null keys are supported. + + Support for null keys adds an issue because the Dictionary class Lookup uses for + storage does not support null keys. So, we need to treat null keys separately. + Unfortunately, since TKey may be a value type, we cannot test whether the key is null + using the user-specified equality comparer. + + C# does allow us to compare the key against null using the == operator, but there is a + possibility that the user's equality comparer considers null to be equal to other values. + Now, MSDN documentation specifies that if IEqualityComparer.Equals(x,y) returns true, it + must be the case that x and y have the same hash code, and null has no hash code. Despite + that, we might as well support the use case, even if it is bad practice. + + The solution the Lookup class uses is to treat the key default(TKey) as a special case, + and hold its associated grouping - if any - in a special field instead of inserting it + into a dictionary. + + + + + + + A pair just wraps two bits of data into a single addressable unit. This is a + value type to ensure it remains very lightweight, since it is frequently used + with other primitive data types as well. + + + + + + + PairComparer compares pairs by the first element, and breaks ties by the second + element. + + + + + + + Comparer that wraps another comparer, and flips the result of each comparison to the + opposite answer. + + + + + + A set for various operations. Shamelessly stolen from LINQ's source code. + @TODO: can the Linq one be used directly now that we are in System.Core + + The kind of elements contained within. + + + + A very simple primitive that allows us to share a value across multiple threads. + + + + + + Common miscellaneous utility methods used throughout the code-base. + + + + + A struct to wrap any arbitrary object reference or struct. Used for situations + where we can't tolerate null values (like keys for hashtables). + + + + + + Compares two wrapped structs of the same underlying type for equality. Simply + wraps the actual comparer for the type being wrapped. + + + + + + Represents a sorted, parallel sequence. + + + + + Returns an enumerator that iterates through the sequence. + + An enumerator that iterates through the sequence. + + + + The query execution mode is a hint that specifies how the system should handle + performance trade-offs when parallelizing queries. + + + + + By default, the system will use algorithms for queries + that are ripe for parallelism and will avoid algorithms with high + overheads that will likely result in slow downs for parallel execution. + + + + + Parallelize the entire query, even if that means using high-overhead algorithms. + + + + + Provides a set of static (Shared in Visual Basic) methods for working with specific kinds of + instances. + + + + + Creates a proxy Task that represents the + asynchronous operation of a Task{Task}. + + + It is often useful to be able to return a Task from a + Task{TResult}, where the inner Task represents work done as part of the outer Task{TResult}. However, + doing so results in a Task{Task}, which, if not dealt with carefully, could produce unexpected behavior. Unwrap + solves this problem by creating a proxy Task that represents the entire asynchronous operation of such a Task{Task}. + + The Task{Task} to unwrap. + The exception that is thrown if the + argument is null. + A Task that represents the asynchronous operation of the provided Task{Task}. + + + + Creates a proxy Task{TResult} that represents the + asynchronous operation of a Task{Task{TResult}}. + + + It is often useful to be able to return a Task{TResult} from a Task{TResult}, where the inner Task{TResult} + represents work done as part of the outer Task{TResult}. However, doing so results in a Task{Task{TResult}}, + which, if not dealt with carefully, could produce unexpected behavior. Unwrap solves this problem by + creating a proxy Task{TResult} that represents the entire asynchronous operation of such a Task{Task{TResult}}. + + The Task{Task{TResult}} to unwrap. + The exception that is thrown if the + argument is null. + A Task{TResult} that represents the asynchronous operation of the provided Task{Task{TResult}}. /// Unwraps a Task that returns another Task. + + + diff --git a/packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/redist.txt b/packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/redist.txt new file mode 100644 index 0000000..35fc105 --- /dev/null +++ b/packages/TaskParallelLibrary.1.0.2856.0/lib/Net35/redist.txt @@ -0,0 +1,11 @@ +The files below can be distributed as described in the MICROSOFT REACTIVE EXTENSTIONS FOR JAVASCRIPT AND .NET LIBRARIES License. + +System.Observable.dll +System.CoreEx.dll +System.Reactive.dll +System.Interactive.dll +System.Threading.dll +System.Linq.Async.dll +System.Reactive.Testing.dll +System.Reactive.ClientProfile.dll +System.Reactive.ExtendedProfile.dll diff --git a/packages/repositories.config b/packages/repositories.config index 065c52e..d48d7cf 100644 --- a/packages/repositories.config +++ b/packages/repositories.config @@ -1,7 +1,5 @@  - - - + \ No newline at end of file From 2916b6aa260f576f67a0342dcf02a94a0ce8b397 Mon Sep 17 00:00:00 2001 From: Kerem KAT Date: Sat, 8 Dec 2012 15:07:55 +0200 Subject: [PATCH 4/9] .NET 3.5 ADO.NET profiling with WebForms is working. Tuples backported form .NET4. --- .gitignore | 2 + Sample.WebForms-NET35/Account/Login.aspx | 2 - .../Account/Login.aspx.designer.cs | 27 +- Sample.WebForms-NET35/Account/Register.aspx | 9 +- .../Account/Register.aspx.cs | 18 +- Sample.WebForms-NET35/Default.aspx | 2 +- Sample.WebForms-NET35/Default.aspx.cs | 39 ++- Sample.WebForms-NET35/Global.asax | 2 +- .../Sample.WebForms-NET35.csproj | 1 + Sample.WebForms-NET35/Site.Master | 4 +- Sample.WebForms-NET35/Web.config | 8 +- StackExchange.Profiling35/Helpers/Tuples.cs | 251 ++++++++++++++++-- StackExchange.Profiling35/MiniProfiler.cs | 28 +- StackExchange.Profiling35/SqlProfiler.cs | 5 +- 14 files changed, 333 insertions(+), 65 deletions(-) diff --git a/.gitignore b/.gitignore index 098fd47..2fb9bde 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ Ruby/*.gem .DS_Store tmp *~ +*/App_Data/*.MDF +*/App_Data/*.ldf \ No newline at end of file diff --git a/Sample.WebForms-NET35/Account/Login.aspx b/Sample.WebForms-NET35/Account/Login.aspx index cd5e6b0..dacd4fe 100644 --- a/Sample.WebForms-NET35/Account/Login.aspx +++ b/Sample.WebForms-NET35/Account/Login.aspx @@ -9,9 +9,7 @@

    Please enter your username and password. - Register if you don't have an account. -

    diff --git a/Sample.WebForms-NET35/Account/Login.aspx.designer.cs b/Sample.WebForms-NET35/Account/Login.aspx.designer.cs index add128b..a696b86 100644 --- a/Sample.WebForms-NET35/Account/Login.aspx.designer.cs +++ b/Sample.WebForms-NET35/Account/Login.aspx.designer.cs @@ -3,24 +3,31 @@ // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. +// the code is regenerated. // //------------------------------------------------------------------------------ -namespace Sample.WebForms_NET35.Account -{ - - - public partial class Login1 - { - +namespace Sample.WebForms_NET35.Account { + + + public partial class Login { + + /// + /// RegisterHyperLink control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.HyperLink RegisterHyperLink; + /// - /// form1 control. + /// LoginUser control. /// /// /// Auto-generated field. /// To modify move field declaration from designer file to code-behind file. /// - protected global::System.Web.UI.HtmlControls.HtmlForm form1; + protected global::System.Web.UI.WebControls.Login LoginUser; } } diff --git a/Sample.WebForms-NET35/Account/Register.aspx b/Sample.WebForms-NET35/Account/Register.aspx index 734632d..2af7216 100644 --- a/Sample.WebForms-NET35/Account/Register.aspx +++ b/Sample.WebForms-NET35/Account/Register.aspx @@ -4,11 +4,7 @@ - - - - - + @@ -63,13 +59,14 @@

    + ValidationGroup="RegisterUserValidationGroup" OnClick="CreateUserButton_Click"/>

  • + diff --git a/Sample.WebForms-NET35/Account/Register.aspx.cs b/Sample.WebForms-NET35/Account/Register.aspx.cs index f024921..111db4f 100644 --- a/Sample.WebForms-NET35/Account/Register.aspx.cs +++ b/Sample.WebForms-NET35/Account/Register.aspx.cs @@ -10,23 +10,27 @@ namespace Sample.WebForms_NET35.Account { public partial class Register : System.Web.UI.Page { - protected void Page_Load(object sender, EventArgs e) - { - //RegisterUser.ContinueDestinationPageUrl = Request.QueryString["ReturnUrl"]; + { } protected void RegisterUser_CreatedUser(object sender, EventArgs e) { - //FormsAuthentication.SetAuthCookie(RegisterUser.UserName, false /* createPersistentCookie */); - /* - string continueUrl = RegisterUser.ContinueDestinationPageUrl; + var registerUser = sender as CreateUserWizard; + FormsAuthentication.SetAuthCookie(registerUser.UserName, false /* createPersistentCookie */); + + string continueUrl = registerUser.ContinueDestinationPageUrl; if (String.IsNullOrEmpty(continueUrl)) { continueUrl = "~/"; } - Response.Redirect(continueUrl);*/ + Response.Redirect(continueUrl); } + protected void RegisterUser_Init(object sender, EventArgs e) + { + var registerUser = sender as CreateUserWizard; + registerUser.ContinueDestinationPageUrl = Request.QueryString["ReturnUrl"]; + } } } diff --git a/Sample.WebForms-NET35/Default.aspx b/Sample.WebForms-NET35/Default.aspx index c05baaa..92aba75 100644 --- a/Sample.WebForms-NET35/Default.aspx +++ b/Sample.WebForms-NET35/Default.aspx @@ -3,7 +3,7 @@ <%@ Import Namespace="StackExchange.Profiling" %> -<% using (MiniProfiler.Current.Step("Default's ")) +<% using (MiniProfilerExtensions.Step(MiniProfiler.Current, "Default's ", ProfileLevel.Info)) { System.Threading.Thread.Sleep(20); %> diff --git a/Sample.WebForms-NET35/Default.aspx.cs b/Sample.WebForms-NET35/Default.aspx.cs index 9ca4535..f7d5c2c 100644 --- a/Sample.WebForms-NET35/Default.aspx.cs +++ b/Sample.WebForms-NET35/Default.aspx.cs @@ -1,10 +1,14 @@ using System; using System.Collections.Generic; +using System.Configuration; +using System.Data.Common; +using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using StackExchange.Profiling; +using StackExchange.Profiling.Data; namespace Sample.WebForms_NET35 { @@ -12,12 +16,43 @@ public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { - /*var mp = MiniProfiler.Current; + var mp = MiniProfiler.Current; using (mp.Step("Page_Load")) { System.Threading.Thread.Sleep(40); - }*/ + } + + /* Warning: Try to login from login.aspx in order to get ASPNETDB created. */ + + SelectTables(); + } + + private void SelectTables() + { + var profiler = MiniProfiler.Current; + var bareFactory = DbProviderFactories.GetFactory("System.Data.SqlClient"); + var providerFactory = new ProfiledDbProviderFactory(profiler, bareFactory); + + var connStr = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString; + + var bareConnection = new SqlConnection(connStr); + + var profiledConnection = new ProfiledDbConnection(bareConnection, profiler); + + var profiledCommand = providerFactory.CreateCommand(); + profiledCommand.Connection = profiledConnection; + profiledCommand.CommandText = "SELECT * FROM sys.tables"; + + using (profiler.Step("Open Connection")) + { + profiledConnection.Open(); + } + + using (profiler.Step("ExecuteNonQuery")) + { + profiledCommand.ExecuteNonQuery(); + } } } } diff --git a/Sample.WebForms-NET35/Global.asax b/Sample.WebForms-NET35/Global.asax index cdf133b..aa6483a 100644 --- a/Sample.WebForms-NET35/Global.asax +++ b/Sample.WebForms-NET35/Global.asax @@ -1 +1 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="Sample.WebForms.Global" Language="C#" %> +<%@ Application Codebehind="Global.asax.cs" Inherits="Sample.WebForms_NET35.Global" Language="C#" %> diff --git a/Sample.WebForms-NET35/Sample.WebForms-NET35.csproj b/Sample.WebForms-NET35/Sample.WebForms-NET35.csproj index 31ad15d..64a8c28 100644 --- a/Sample.WebForms-NET35/Sample.WebForms-NET35.csproj +++ b/Sample.WebForms-NET35/Sample.WebForms-NET35.csproj @@ -43,6 +43,7 @@ + diff --git a/Sample.WebForms-NET35/Site.Master b/Sample.WebForms-NET35/Site.Master index 075eecc..ba1e34d 100644 --- a/Sample.WebForms-NET35/Site.Master +++ b/Sample.WebForms-NET35/Site.Master @@ -8,7 +8,7 @@ - <%= StackExchange.Profiling.MiniProfiler.RenderIncludes() %> + <%= StackExchange.Profiling.MiniProfiler.RenderIncludesAsString() %> @@ -36,7 +36,7 @@ { System.Threading.Thread.Sleep(20); %> - + diff --git a/Sample.WebForms-NET35/Web.config b/Sample.WebForms-NET35/Web.config index b601391..7df6b87 100644 --- a/Sample.WebForms-NET35/Web.config +++ b/Sample.WebForms-NET35/Web.config @@ -5,10 +5,11 @@ --> - + - + @@ -51,5 +52,8 @@ + + + \ No newline at end of file diff --git a/StackExchange.Profiling35/Helpers/Tuples.cs b/StackExchange.Profiling35/Helpers/Tuples.cs index 6cd1a74..4d8af6d 100644 --- a/StackExchange.Profiling35/Helpers/Tuples.cs +++ b/StackExchange.Profiling35/Helpers/Tuples.cs @@ -1,57 +1,250 @@ using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; -namespace StackExchange.Profiling.Helpers +namespace StackExchange.Profiling.Helpers.Tuples { - public class Tuple + /// Provides static methods for creating tuple objects. + public static class Tuple35 { - public Tuple(T1 item1) + /// Creates a new 1-tuple, or singleton. + /// A tuple whose value is (). + /// The value of the only component of the tuple. + /// The type of the only component of the tuple. + public static Tuple Create(T1 item1) { - Item1 = item1; + return new Tuple(item1); } - - public T1 Item1 { get; set; } - } - - public class Tuple : Tuple - { - public Tuple(T1 item1, T2 item2) - : base(item1) + /// Creates a new 2-tuple, or pair. + /// A 2-tuple whose value is (, ). + /// The value of the first component of the tuple. + /// The value of the second component of the tuple. + /// The type of the first component of the tuple. + /// The type of the second component of the tuple. + public static Tuple Create(T1 item1, T2 item2) + { + return new Tuple(item1, item2); + } + internal static int CombineHashCodes(int h1, int h2) { - Item2 = item2; + return (h1 << 5) + h1 ^ h2; + } + internal static int CombineHashCodes(int h1, int h2, int h3) + { + return Tuple35.CombineHashCodes(Tuple35.CombineHashCodes(h1, h2), h3); } - - public T2 Item2 { get; set; } } - public class Tuple : Tuple + [Serializable] + public class Tuple : IComparable { - public Tuple(T1 item1, T2 item2, T3 item3) - : base(item1, item2) + private readonly T1 m_Item1; + /// Gets the value of the object's single component. + /// The value of the current object's single component. + public T1 Item1 + { + get + { + return this.m_Item1; + } + } + /// Initializes a new instance of the class. + /// The value of the tuple's only component. + public Tuple(T1 item1) + { + this.m_Item1 = item1; + } + /// Returns a value that indicates whether the current object is equal to a specified object. + /// true if the current instance is equal to the specified object; otherwise, false. + /// The object to compare with this instance. + public override bool Equals(object obj) + { + return this.Equals(obj, EqualityComparer.Default); + } + /// Returns a value that indicates whether the current object is equal to a specified object based on a specified comparison method. + /// true if the current instance is equal to the specified object; otherwise, false. + /// The object to compare with this instance. + /// An object that defines the method to use to evaluate whether the two objects are equal. + bool Equals(object other, IEqualityComparer comparer) + { + if (other == null) + { + return false; + } + Tuple tuple = other as Tuple; + return tuple != null && comparer.Equals(this.m_Item1, tuple.m_Item1); + } + /// Compares the current object to a specified object, and returns an integer that indicates whether the current object is before, after, or in the same position as the specified object in the sort order. + /// A signed integer that indicates the relative position of this instance and in the sort order, as shown in the following table.ValueDescriptionA negative integerThis instance precedes .ZeroThis instance and have the same position in the sort order.A positive integerThis instance follows . + /// An object to compare with the current instance. + /// + /// is not a object. + int IComparable.CompareTo(object obj) + { + return this.CompareTo(obj, Comparer.Default); + } + /// Compares the current object to a specified object by using a specified comparer, and returns an integer that indicates whether the current object is before, after, or in the same position as the specified object in the sort order. + /// A signed integer that indicates the relative position of this instance and in the sort order, as shown in the following table.ValueDescriptionA negative integerThis instance precedes .ZeroThis instance and have the same position in the sort order.A positive integerThis instance follows . + /// An object to compare with the current instance. + /// An object that provides custom rules for comparison. + /// + /// is not a object. + int CompareTo(object other, IComparer comparer) + { + if (other == null) + { + return 1; + } + Tuple tuple = other as Tuple; + if (tuple == null) + { + throw new ArgumentException("ArgumentException_TupleIncorrectType", "other"); + } + return comparer.Compare(this.m_Item1, tuple.m_Item1); + } + /// Returns the hash code for the current object. + /// A 32-bit signed integer hash code. + public override int GetHashCode() + { + return this.GetHashCode(EqualityComparer.Default); + } + /// Calculates the hash code for the current object by using a specified computation method. + /// A 32-bit signed integer hash code. + /// An object whose method calculates the hash code of the current object. + int GetHashCode(IEqualityComparer comparer) { - Item3 = item3; + return comparer.GetHashCode(this.m_Item1); } - public T3 Item3 { get; set; } + /// Returns a string that represents the value of this instance. + /// The string representation of this object. + public override string ToString() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append("("); + return this.ToString(stringBuilder); + } + string ToString(StringBuilder sb) + { + sb.Append(this.m_Item1); + sb.Append(")"); + return sb.ToString(); + } } - public static class Tuple + public class Tuple : IComparable { - public static Tuple Create(T1 item1) + private readonly T1 m_Item1; + private readonly T2 m_Item2; + /// Gets the value of the current object's first component. + /// The value of the current object's first component. + public T1 Item1 { - return new Tuple(item1); + get + { + return this.m_Item1; + } } - - public static Tuple Create(T1 item1, T2 item2) + /// Gets the value of the current object's second component. + /// The value of the current object's second component. + public T2 Item2 { - return new Tuple(item1, item2); + get + { + return this.m_Item2; + } } - - public static Tuple Create(T1 item1, T2 item2, T3 item3) + /// Initializes a new instance of the class. + /// The value of the tuple's first component. + /// The value of the tuple's second component. + public Tuple(T1 item1, T2 item2) + { + this.m_Item1 = item1; + this.m_Item2 = item2; + } + /// Returns a value that indicates whether the current object is equal to a specified object. + /// true if the current instance is equal to the specified object; otherwise, false. + /// The object to compare with this instance. + public override bool Equals(object obj) + { + return this.Equals(obj, EqualityComparer.Default); + } + /// Returns a value that indicates whether the current object is equal to a specified object based on a specified comparison method. + /// true if the current instance is equal to the specified object; otherwise, false. + /// The object to compare with this instance. + /// An object that defines the method to use to evaluate whether the two objects are equal. + bool Equals(object other, IEqualityComparer comparer) + { + if (other == null) + { + return false; + } + Tuple tuple = other as Tuple; + return tuple != null && comparer.Equals(this.m_Item1, tuple.m_Item1) && comparer.Equals(this.m_Item2, tuple.m_Item2); + } + /// Compares the current object to a specified object and returns an integer that indicates whether the current object is before, after, or in the same position as the specified object in the sort order. + /// A signed integer that indicates the relative position of this instance and in the sort order, as shown in the following table.ValueDescriptionA negative integerThis instance precedes .ZeroThis instance and have the same position in the sort order.A positive integerThis instance follows . + /// An object to compare with the current instance. + /// + /// is not a object. + int IComparable.CompareTo(object obj) + { + return this.CompareTo(obj, Comparer.Default); + } + /// Compares the current object to a specified object by using a specified comparer, and returns an integer that indicates whether the current object is before, after, or in the same position as the specified object in the sort order. + /// A signed integer that indicates the relative position of this instance and in the sort order, as shown in the following table.ValueDescriptionA negative integerThis instance precedes .ZeroThis instance and have the same position in the sort order.A positive integerThis instance follows . + /// An object to compare with the current instance. + /// An object that provides custom rules for comparison. + /// + /// is not a object. + int CompareTo(object other, IComparer comparer) + { + if (other == null) + { + return 1; + } + Tuple tuple = other as Tuple; + if (tuple == null) + { + throw new ArgumentException("ArgumentException_TupleIncorrectType", "other"); + } + int num = comparer.Compare(this.m_Item1, tuple.m_Item1); + if (num != 0) + { + return num; + } + return comparer.Compare(this.m_Item2, tuple.m_Item2); + } + /// Returns the hash code for the current object. + /// A 32-bit signed integer hash code. + public override int GetHashCode() + { + return this.GetHashCode(EqualityComparer.Default); + } + /// Calculates the hash code for the current object by using a specified computation method. + /// A 32-bit signed integer hash code. + /// An object whose method calculates the hash code of the current object. + int GetHashCode(IEqualityComparer comparer) + { + return Tuple35.CombineHashCodes(comparer.GetHashCode(this.m_Item1), comparer.GetHashCode(this.m_Item2)); + } + /// Returns a string that represents the value of this instance. + /// The string representation of this object. + public override string ToString() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.Append("("); + return this.ToString(stringBuilder); + } + string ToString(StringBuilder sb) { - return new Tuple(item1, item2, item3); + sb.Append(this.m_Item1); + sb.Append(", "); + sb.Append(this.m_Item2); + sb.Append(")"); + return sb.ToString(); } } } diff --git a/StackExchange.Profiling35/MiniProfiler.cs b/StackExchange.Profiling35/MiniProfiler.cs index 9c7d7d8..d7febae 100644 --- a/StackExchange.Profiling35/MiniProfiler.cs +++ b/StackExchange.Profiling35/MiniProfiler.cs @@ -317,22 +317,48 @@ public static void Stop(bool discardResults = false) Settings.ProfilerProvider.Stop(discardResults); } + /// + /// Returns an that will time the code between its creation and disposal. Use this method when you + /// do not wish to include the StackExchange.Profiling namespace for the extension method. + /// + /// A descriptive name for the code that is encapsulated by the resulting IDisposable's lifetime. + public static IDisposable StepStatic(string name) + { + return StepStatic(name, ProfileLevel.Info); + } + /// /// Returns an that will time the code between its creation and disposal. Use this method when you /// do not wish to include the StackExchange.Profiling namespace for the extension method. /// /// A descriptive name for the code that is encapsulated by the resulting IDisposable's lifetime. /// This step's visibility level; allows filtering when is called. - public static IDisposable StepStatic(string name, ProfileLevel level = ProfileLevel.Info) + public static IDisposable StepStatic(string name, ProfileLevel level) { return MiniProfilerExtensions.Step(Current, name, level); } + public static MvcHtmlString RenderIncludes() + { + return RenderIncludes(null); + } + + public static string RenderIncludesAsString() + { + return RenderIncludesAsString(null); + } + public static MvcHtmlString RenderIncludes(RenderPosition? position = null, bool? showTrivial = null, bool? showTimeWithChildren = null, int? maxTracesToShow = null, bool? showControls = null, bool? useExistingjQuery = null, bool samplingOnly = false) { return UI.MiniProfilerHandler.RenderIncludes(Current, position, showTrivial, showTimeWithChildren, maxTracesToShow, showControls, useExistingjQuery); } + public static string RenderIncludesAsString(RenderPosition? position = null, bool? showTrivial = null, bool? showTimeWithChildren = null, int? maxTracesToShow = null, bool? showControls = null, bool? useExistingjQuery = null, bool samplingOnly = false) + { + var mvcString = UI.MiniProfilerHandler.RenderIncludes(Current, position, showTrivial, showTimeWithChildren, maxTracesToShow, showControls, useExistingjQuery); + return mvcString.ToString(); + } + /// /// Gets the currently running MiniProfiler for the current HttpContext; null if no MiniProfiler was ed. /// diff --git a/StackExchange.Profiling35/SqlProfiler.cs b/StackExchange.Profiling35/SqlProfiler.cs index 937a6c7..8d2a5ff 100644 --- a/StackExchange.Profiling35/SqlProfiler.cs +++ b/StackExchange.Profiling35/SqlProfiler.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Collections.Concurrent; using StackExchange.Profiling.Helpers; +using StackExchange.Profiling.Helpers.Tuples; namespace StackExchange.Profiling { @@ -37,7 +38,7 @@ public SqlProfiler(MiniProfiler profiler) /// public void ExecuteStartImpl(IDbCommand command, ExecuteType type) { - var id = Tuple.Create((object)command, type); + var id = Tuple35.Create((object)command, type); var sqlTiming = new SqlTiming(command, type, Profiler); _inProgress[id] = sqlTiming; @@ -54,7 +55,7 @@ public SqlTiming[] GetInProgressCommands() /// public void ExecuteFinishImpl(IDbCommand command, ExecuteType type, DbDataReader reader = null) { - var id = Tuple.Create((object)command, type); + var id = Tuple35.Create((object)command, type); var current = _inProgress[id]; current.ExecutionComplete(isReader: reader != null); SqlTiming ignore; From f6b5017908c223c265e8fb8b7d671fbc39085c62 Mon Sep 17 00:00:00 2001 From: Kerem KAT Date: Sat, 8 Dec 2012 15:29:20 +0200 Subject: [PATCH 5/9] UI folder moved to Profiling35 project. --- Sample.Mvc/Global.asax.cs | 2 + Sample.Wcf/Global.asax.cs | 1 + Sample.WebForms/Global.asax.cs | 1 + Sample.WebForms/Site.Master | 2 +- .../StackExchange.Profiling.csproj | 27 +- .../UI/include.partial.html | 1 - StackExchange.Profiling/UI/includes.css | 1 - StackExchange.Profiling/UI/includes.js | 897 ------------------ StackExchange.Profiling/UI/includes.less | 468 --------- StackExchange.Profiling/UI/includes.tmpl | 219 ----- StackExchange.Profiling/UI/jquery.1.7.1.js | 4 - StackExchange.Profiling/UI/jquery.tmpl.js | 486 ---------- StackExchange.Profiling/UI/list.css | 9 - StackExchange.Profiling/UI/list.js | 38 - StackExchange.Profiling/UI/list.tmpl | 34 - StackExchange.Profiling/UI/share.html | 11 - .../StackExchange.Profiling35.csproj | 6 + .../lib/dotless.Compiler.exe | Bin 18 files changed, 13 insertions(+), 2194 deletions(-) delete mode 100644 StackExchange.Profiling/UI/include.partial.html delete mode 100644 StackExchange.Profiling/UI/includes.css delete mode 100644 StackExchange.Profiling/UI/includes.js delete mode 100644 StackExchange.Profiling/UI/includes.less delete mode 100644 StackExchange.Profiling/UI/includes.tmpl delete mode 100644 StackExchange.Profiling/UI/jquery.1.7.1.js delete mode 100644 StackExchange.Profiling/UI/jquery.tmpl.js delete mode 100644 StackExchange.Profiling/UI/list.css delete mode 100644 StackExchange.Profiling/UI/list.js delete mode 100644 StackExchange.Profiling/UI/list.tmpl delete mode 100644 StackExchange.Profiling/UI/share.html rename {StackExchange.Profiling => StackExchange.Profiling35}/lib/dotless.Compiler.exe (100%) diff --git a/Sample.Mvc/Global.asax.cs b/Sample.Mvc/Global.asax.cs index c2c175a..eb3034d 100644 --- a/Sample.Mvc/Global.asax.cs +++ b/Sample.Mvc/Global.asax.cs @@ -147,6 +147,8 @@ private void InitProfilerSettings() // you may implement this if you need to restrict visibility of profiling lists on a per request basis return true; // all requests are kosher }; + + MiniProfiler.Settings.ProfilerProvider = new WebRequestProfilerProvider40(); } } diff --git a/Sample.Wcf/Global.asax.cs b/Sample.Wcf/Global.asax.cs index e986cfe..effc2b3 100644 --- a/Sample.Wcf/Global.asax.cs +++ b/Sample.Wcf/Global.asax.cs @@ -53,6 +53,7 @@ private void InitProfilerSettings() MiniProfiler.Settings.ExcludeAssembly("NHibernate"); // Ignore any assembly named NHibernate MiniProfiler.Settings.ExcludeMethod("Flush"); // Ignore any method with the name of Flush MiniProfiler.Settings.StackMaxLength = 256; // default is 120 characters + MiniProfiler.Settings.ProfilerProvider = new WebRequestProfilerProvider40(); } protected void Application_Start(object sender, EventArgs e) diff --git a/Sample.WebForms/Global.asax.cs b/Sample.WebForms/Global.asax.cs index 8924d60..f4046cb 100644 --- a/Sample.WebForms/Global.asax.cs +++ b/Sample.WebForms/Global.asax.cs @@ -57,6 +57,7 @@ private void InitProfilerSettings() MiniProfiler.Settings.Storage = new SampleWeb.Helpers.SqliteMiniProfilerStorage(SampleWeb.MvcApplication.ConnectionString); MiniProfiler.Settings.SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter(); + MiniProfiler.Settings.ProfilerProvider = new WebRequestProfilerProvider40(); } } } diff --git a/Sample.WebForms/Site.Master b/Sample.WebForms/Site.Master index c46e85a..83a153c 100644 --- a/Sample.WebForms/Site.Master +++ b/Sample.WebForms/Site.Master @@ -8,7 +8,7 @@ - <%= StackExchange.Profiling.MiniProfiler.RenderIncludes() %> + <%= StackExchange.Profiling.MiniProfiler.RenderIncludesAsString() %> diff --git a/StackExchange.Profiling/StackExchange.Profiling.csproj b/StackExchange.Profiling/StackExchange.Profiling.csproj index ef41743..5914e24 100644 --- a/StackExchange.Profiling/StackExchange.Profiling.csproj +++ b/StackExchange.Profiling/StackExchange.Profiling.csproj @@ -72,23 +72,6 @@ - - - - - - - - - - Designer - - - - - - - @@ -100,20 +83,14 @@ StackExchange.Profiling35 - - - - - - - - "$(ProjectDir)lib\dotless.Compiler.exe" -m "$(ProjectDir)UI\includes.less" "$(ProjectDir)UI\includes.css" + + - SampleWeb.SampleService.RouteHit + SampleWeb.SampleService.RouteHit, Service References.SampleService.Reference.cs, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null \ No newline at end of file diff --git a/StackExchange.Profiling.EntityFramework6/StackExchange.Profiling.EntityFramework6.csproj b/StackExchange.Profiling.EntityFramework6/StackExchange.Profiling.EntityFramework6.csproj index cf1da18..cfffc66 100644 --- a/StackExchange.Profiling.EntityFramework6/StackExchange.Profiling.EntityFramework6.csproj +++ b/StackExchange.Profiling.EntityFramework6/StackExchange.Profiling.EntityFramework6.csproj @@ -71,6 +71,14 @@ + + {44612123-b2e2-458a-859f-7077134d31c8} + StackExchange.Profiling.AdoNet + + + {ab77f5b3-615e-446b-9905-833fdef734a0} + StackExchange.Profiling35 + {386222bd-6b6e-480f-a342-8de1ab516e2c} StackExchange.Profiling From cf751b3c415d235c4a40d3f75426295e12c9fe82 Mon Sep 17 00:00:00 2001 From: Kerem Date: Wed, 22 Jan 2014 23:08:46 +0200 Subject: [PATCH 9/9] Update Readme.md --- Readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Readme.md b/Readme.md index 2633c38..eef459f 100644 --- a/Readme.md +++ b/Readme.md @@ -11,3 +11,5 @@ Docs for the ruby version can be found here: https://github.com/SamSaffron/MiniP Licensed under apache 2.0 license, see: http://www.apache.org/licenses/LICENSE-2.0 For bugs and feature requests go to: http://community.miniprofiler.com + +[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/krk/miniprofiler/trend.png)](https://bitdeli.com/free "Bitdeli Badge")