mscorlib(4.0.0.0) API with additions
TaskFactory.cs
5 
7 {
10  [__DynamicallyInvokable]
11  [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)]
12  public class TaskFactory<TResult>
13  {
14  private sealed class FromAsyncTrimPromise<TInstance> : Task<TResult> where TInstance : class
15  {
16  internal static readonly AsyncCallback s_completeFromAsyncResult = CompleteFromAsyncResult;
17 
18  private TInstance m_thisRef;
19 
20  private Func<TInstance, IAsyncResult, TResult> m_endMethod;
21 
22  internal FromAsyncTrimPromise(TInstance thisRef, Func<TInstance, IAsyncResult, TResult> endMethod)
23  {
24  m_thisRef = thisRef;
25  m_endMethod = endMethod;
26  }
27 
28  internal static void CompleteFromAsyncResult(IAsyncResult asyncResult)
29  {
30  if (asyncResult == null)
31  {
32  throw new ArgumentNullException("asyncResult");
33  }
34  FromAsyncTrimPromise<TInstance> fromAsyncTrimPromise = asyncResult.AsyncState as FromAsyncTrimPromise<TInstance>;
35  if (fromAsyncTrimPromise == null)
36  {
37  throw new ArgumentException(Environment.GetResourceString("InvalidOperation_WrongAsyncResultOrEndCalledMultiple"), "asyncResult");
38  }
39  TInstance thisRef = fromAsyncTrimPromise.m_thisRef;
40  Func<TInstance, IAsyncResult, TResult> endMethod = fromAsyncTrimPromise.m_endMethod;
41  fromAsyncTrimPromise.m_thisRef = null;
42  fromAsyncTrimPromise.m_endMethod = null;
43  if (endMethod == null)
44  {
45  throw new ArgumentException(Environment.GetResourceString("InvalidOperation_WrongAsyncResultOrEndCalledMultiple"), "asyncResult");
46  }
47  if (!asyncResult.CompletedSynchronously)
48  {
49  fromAsyncTrimPromise.Complete(thisRef, endMethod, asyncResult, requiresSynchronization: true);
50  }
51  }
52 
53  internal void Complete(TInstance thisRef, Func<TInstance, IAsyncResult, TResult> endMethod, IAsyncResult asyncResult, bool requiresSynchronization)
54  {
55  bool flag = false;
56  try
57  {
58  TResult result = endMethod(thisRef, asyncResult);
59  if (requiresSynchronization)
60  {
61  flag = TrySetResult(result);
62  }
63  else
64  {
65  DangerousSetResult(result);
66  flag = true;
67  }
68  }
70  {
71  flag = TrySetCanceled(ex.CancellationToken, ex);
72  }
73  catch (Exception exceptionObject)
74  {
75  flag = TrySetException(exceptionObject);
76  }
77  }
78  }
79 
80  private CancellationToken m_defaultCancellationToken;
81 
82  private TaskScheduler m_defaultScheduler;
83 
84  private TaskCreationOptions m_defaultCreationOptions;
85 
86  private TaskContinuationOptions m_defaultContinuationOptions;
87 
88  private TaskScheduler DefaultScheduler
89  {
90  get
91  {
92  if (m_defaultScheduler == null)
93  {
94  return TaskScheduler.Current;
95  }
96  return m_defaultScheduler;
97  }
98  }
99 
102  [__DynamicallyInvokable]
104  {
105  [__DynamicallyInvokable]
106  get
107  {
108  return m_defaultCancellationToken;
109  }
110  }
111 
114  [__DynamicallyInvokable]
115  public TaskScheduler Scheduler
116  {
117  [__DynamicallyInvokable]
118  get
119  {
120  return m_defaultScheduler;
121  }
122  }
123 
126  [__DynamicallyInvokable]
128  {
129  [__DynamicallyInvokable]
130  get
131  {
132  return m_defaultCreationOptions;
133  }
134  }
135 
138  [__DynamicallyInvokable]
140  {
141  [__DynamicallyInvokable]
142  get
143  {
144  return m_defaultContinuationOptions;
145  }
146  }
147 
148  private TaskScheduler GetDefaultScheduler(Task currTask)
149  {
150  if (m_defaultScheduler != null)
151  {
152  return m_defaultScheduler;
153  }
154  if (currTask != null && (currTask.CreationOptions & TaskCreationOptions.HideScheduler) == TaskCreationOptions.None)
155  {
156  return currTask.ExecutingTaskScheduler;
157  }
158  return TaskScheduler.Default;
159  }
160 
162  [__DynamicallyInvokable]
163  public TaskFactory()
165  {
166  }
167 
170  [__DynamicallyInvokable]
171  public TaskFactory(CancellationToken cancellationToken)
172  : this(cancellationToken, TaskCreationOptions.None, TaskContinuationOptions.None, (TaskScheduler)null)
173  {
174  }
175 
178  [__DynamicallyInvokable]
179  public TaskFactory(TaskScheduler scheduler)
181  {
182  }
183 
189  [__DynamicallyInvokable]
190  public TaskFactory(TaskCreationOptions creationOptions, TaskContinuationOptions continuationOptions)
191  : this(default(CancellationToken), creationOptions, continuationOptions, (TaskScheduler)null)
192  {
193  }
194 
202  [__DynamicallyInvokable]
203  public TaskFactory(CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
204  {
205  TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions);
206  TaskFactory.CheckCreationOptions(creationOptions);
207  m_defaultCancellationToken = cancellationToken;
208  m_defaultScheduler = scheduler;
209  m_defaultCreationOptions = creationOptions;
210  m_defaultContinuationOptions = continuationOptions;
211  }
212 
217  [MethodImpl(MethodImplOptions.NoInlining)]
218  [__DynamicallyInvokable]
219  public Task<TResult> StartNew(Func<TResult> function)
220  {
221  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
222  Task internalCurrent = Task.InternalCurrent;
223  return Task<TResult>.StartNew(internalCurrent, function, m_defaultCancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
224  }
225 
232  [MethodImpl(MethodImplOptions.NoInlining)]
233  [__DynamicallyInvokable]
234  public Task<TResult> StartNew(Func<TResult> function, CancellationToken cancellationToken)
235  {
236  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
237  Task internalCurrent = Task.InternalCurrent;
238  return Task<TResult>.StartNew(internalCurrent, function, cancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
239  }
240 
247  [MethodImpl(MethodImplOptions.NoInlining)]
248  [__DynamicallyInvokable]
249  public Task<TResult> StartNew(Func<TResult> function, TaskCreationOptions creationOptions)
250  {
251  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
252  Task internalCurrent = Task.InternalCurrent;
253  return Task<TResult>.StartNew(internalCurrent, function, m_defaultCancellationToken, creationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
254  }
255 
265  [MethodImpl(MethodImplOptions.NoInlining)]
266  [__DynamicallyInvokable]
267  public Task<TResult> StartNew(Func<TResult> function, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
268  {
269  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
270  return Task<TResult>.StartNew(Task.InternalCurrentIfAttached(creationOptions), function, cancellationToken, creationOptions, InternalTaskOptions.None, scheduler, ref stackMark);
271  }
272 
278  [MethodImpl(MethodImplOptions.NoInlining)]
279  [__DynamicallyInvokable]
280  public Task<TResult> StartNew(Func<object, TResult> function, object state)
281  {
282  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
283  Task internalCurrent = Task.InternalCurrent;
284  return Task<TResult>.StartNew(internalCurrent, function, state, m_defaultCancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
285  }
286 
294  [MethodImpl(MethodImplOptions.NoInlining)]
295  [__DynamicallyInvokable]
296  public Task<TResult> StartNew(Func<object, TResult> function, object state, CancellationToken cancellationToken)
297  {
298  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
299  Task internalCurrent = Task.InternalCurrent;
300  return Task<TResult>.StartNew(internalCurrent, function, state, cancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
301  }
302 
310  [MethodImpl(MethodImplOptions.NoInlining)]
311  [__DynamicallyInvokable]
312  public Task<TResult> StartNew(Func<object, TResult> function, object state, TaskCreationOptions creationOptions)
313  {
314  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
315  Task internalCurrent = Task.InternalCurrent;
316  return Task<TResult>.StartNew(internalCurrent, function, state, m_defaultCancellationToken, creationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
317  }
318 
329  [MethodImpl(MethodImplOptions.NoInlining)]
330  [__DynamicallyInvokable]
331  public Task<TResult> StartNew(Func<object, TResult> function, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
332  {
333  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
334  return Task<TResult>.StartNew(Task.InternalCurrentIfAttached(creationOptions), function, state, cancellationToken, creationOptions, InternalTaskOptions.None, scheduler, ref stackMark);
335  }
336 
337  private static void FromAsyncCoreLogic(IAsyncResult iar, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, Task<TResult> promise, bool requiresSynchronization)
338  {
339  Exception ex = null;
340  OperationCanceledException ex2 = null;
341  TResult result = default(TResult);
342  try
343  {
344  if (endFunction != null)
345  {
346  result = endFunction(iar);
347  }
348  else
349  {
350  endAction(iar);
351  }
352  }
353  catch (OperationCanceledException ex3)
354  {
355  ex2 = ex3;
356  }
357  catch (Exception ex4)
358  {
359  ex = ex4;
360  }
361  finally
362  {
363  if (ex2 != null)
364  {
365  promise.TrySetCanceled(ex2.CancellationToken, ex2);
366  }
367  else if (ex != null)
368  {
369  if (promise.TrySetException(ex) && ex is ThreadAbortException)
370  {
371  promise.m_contingentProperties.m_exceptionsHolder.MarkAsHandled(calledFromFinalizer: false);
372  }
373  }
374  else
375  {
376  if (AsyncCausalityTracer.LoggingOn)
377  {
378  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, promise.Id, AsyncCausalityStatus.Completed);
379  }
380  if (Task.s_asyncDebuggingEnabled)
381  {
382  Task.RemoveFromActiveTasks(promise.Id);
383  }
384  if (requiresSynchronization)
385  {
386  promise.TrySetResult(result);
387  }
388  else
389  {
390  promise.DangerousSetResult(result);
391  }
392  }
393  }
394  }
395 
401  [MethodImpl(MethodImplOptions.NoInlining)]
402  [__DynamicallyInvokable]
403  public Task<TResult> FromAsync(IAsyncResult asyncResult, Func<IAsyncResult, TResult> endMethod)
404  {
405  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
406  return FromAsyncImpl(asyncResult, endMethod, null, m_defaultCreationOptions, DefaultScheduler, ref stackMark);
407  }
408 
416  [MethodImpl(MethodImplOptions.NoInlining)]
417  [__DynamicallyInvokable]
418  public Task<TResult> FromAsync(IAsyncResult asyncResult, Func<IAsyncResult, TResult> endMethod, TaskCreationOptions creationOptions)
419  {
420  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
421  return FromAsyncImpl(asyncResult, endMethod, null, creationOptions, DefaultScheduler, ref stackMark);
422  }
423 
432  [MethodImpl(MethodImplOptions.NoInlining)]
433  [__DynamicallyInvokable]
434  public Task<TResult> FromAsync(IAsyncResult asyncResult, Func<IAsyncResult, TResult> endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler)
435  {
436  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
437  return FromAsyncImpl(asyncResult, endMethod, null, creationOptions, scheduler, ref stackMark);
438  }
439 
440  internal static Task<TResult> FromAsyncImpl(IAsyncResult asyncResult, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, TaskCreationOptions creationOptions, TaskScheduler scheduler, ref StackCrawlMark stackMark)
441  {
442  if (asyncResult == null)
443  {
444  throw new ArgumentNullException("asyncResult");
445  }
446  if (endFunction == null && endAction == null)
447  {
448  throw new ArgumentNullException("endMethod");
449  }
450  if (scheduler == null)
451  {
452  throw new ArgumentNullException("scheduler");
453  }
454  TaskFactory.CheckFromAsyncOptions(creationOptions, hasBeginMethod: false);
455  Task<TResult> promise = new Task<TResult>((object)null, creationOptions);
456  if (AsyncCausalityTracer.LoggingOn)
457  {
458  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, promise.Id, "TaskFactory.FromAsync", 0uL);
459  }
460  if (Task.s_asyncDebuggingEnabled)
461  {
462  Task.AddToActiveTasks(promise);
463  }
464  Task t = new Task(delegate
465  {
466  FromAsyncCoreLogic(asyncResult, endFunction, endAction, promise, requiresSynchronization: true);
467  }, null, null, default(CancellationToken), TaskCreationOptions.None, InternalTaskOptions.None, null, ref stackMark);
468  if (AsyncCausalityTracer.LoggingOn)
469  {
470  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Verbose, t.Id, "TaskFactory.FromAsync Callback", 0uL);
471  }
472  if (Task.s_asyncDebuggingEnabled)
473  {
474  Task.AddToActiveTasks(t);
475  }
476  if (asyncResult.IsCompleted)
477  {
478  try
479  {
480  t.InternalRunSynchronously(scheduler, waitForCompletion: false);
481  }
482  catch (Exception exceptionObject)
483  {
484  promise.TrySetException(exceptionObject);
485  }
486  }
487  else
488  {
489  ThreadPool.RegisterWaitForSingleObject(asyncResult.AsyncWaitHandle, delegate
490  {
491  try
492  {
493  t.InternalRunSynchronously(scheduler, waitForCompletion: false);
494  }
495  catch (Exception exceptionObject2)
496  {
497  promise.TrySetException(exceptionObject2);
498  }
499  }, null, -1, executeOnlyOnce: true);
500  }
501  return promise;
502  }
503 
510  [__DynamicallyInvokable]
511  public Task<TResult> FromAsync(Func<AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, object state)
512  {
513  return FromAsyncImpl(beginMethod, endMethod, null, state, m_defaultCreationOptions);
514  }
515 
524  [__DynamicallyInvokable]
525  public Task<TResult> FromAsync(Func<AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, object state, TaskCreationOptions creationOptions)
526  {
527  return FromAsyncImpl(beginMethod, endMethod, null, state, creationOptions);
528  }
529 
530  internal static Task<TResult> FromAsyncImpl(Func<AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, object state, TaskCreationOptions creationOptions)
531  {
532  if (beginMethod == null)
533  {
534  throw new ArgumentNullException("beginMethod");
535  }
536  if (endFunction == null && endAction == null)
537  {
538  throw new ArgumentNullException("endMethod");
539  }
540  TaskFactory.CheckFromAsyncOptions(creationOptions, hasBeginMethod: true);
541  Task<TResult> promise = new Task<TResult>(state, creationOptions);
542  if (AsyncCausalityTracer.LoggingOn)
543  {
544  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, promise.Id, "TaskFactory.FromAsync: " + beginMethod.Method.Name, 0uL);
545  }
546  if (Task.s_asyncDebuggingEnabled)
547  {
548  Task.AddToActiveTasks(promise);
549  }
550  try
551  {
552  if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
553  {
554  IAsyncResult asyncResult = beginMethod(delegate(IAsyncResult iar)
555  {
556  if (!iar.CompletedSynchronously)
557  {
558  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
559  }
560  }, state);
561  if (asyncResult.CompletedSynchronously)
562  {
563  FromAsyncCoreLogic(asyncResult, endFunction, endAction, promise, requiresSynchronization: false);
564  }
565  }
566  else
567  {
568  IAsyncResult asyncResult2 = beginMethod(delegate(IAsyncResult iar)
569  {
570  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
571  }, state);
572  }
573  }
574  catch
575  {
576  if (AsyncCausalityTracer.LoggingOn)
577  {
578  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, promise.Id, AsyncCausalityStatus.Error);
579  }
580  if (Task.s_asyncDebuggingEnabled)
581  {
582  Task.RemoveFromActiveTasks(promise.Id);
583  }
584  promise.TrySetResult(default(TResult));
585  throw;
586  }
587  return promise;
588  }
589 
598  [__DynamicallyInvokable]
599  public Task<TResult> FromAsync<TArg1>(Func<TArg1, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, object state)
600  {
601  return FromAsyncImpl(beginMethod, endMethod, null, arg1, state, m_defaultCreationOptions);
602  }
603 
614  [__DynamicallyInvokable]
615  public Task<TResult> FromAsync<TArg1>(Func<TArg1, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, object state, TaskCreationOptions creationOptions)
616  {
617  return FromAsyncImpl(beginMethod, endMethod, null, arg1, state, creationOptions);
618  }
619 
620  internal static Task<TResult> FromAsyncImpl<TArg1>(Func<TArg1, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, TArg1 arg1, object state, TaskCreationOptions creationOptions)
621  {
622  if (beginMethod == null)
623  {
624  throw new ArgumentNullException("beginMethod");
625  }
626  if (endFunction == null && endAction == null)
627  {
628  throw new ArgumentNullException("endFunction");
629  }
630  TaskFactory.CheckFromAsyncOptions(creationOptions, hasBeginMethod: true);
631  Task<TResult> promise = new Task<TResult>(state, creationOptions);
632  if (AsyncCausalityTracer.LoggingOn)
633  {
634  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, promise.Id, "TaskFactory.FromAsync: " + beginMethod.Method.Name, 0uL);
635  }
636  if (Task.s_asyncDebuggingEnabled)
637  {
638  Task.AddToActiveTasks(promise);
639  }
640  try
641  {
642  if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
643  {
644  IAsyncResult asyncResult = beginMethod(arg1, delegate(IAsyncResult iar)
645  {
646  if (!iar.CompletedSynchronously)
647  {
648  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
649  }
650  }, state);
651  if (asyncResult.CompletedSynchronously)
652  {
653  FromAsyncCoreLogic(asyncResult, endFunction, endAction, promise, requiresSynchronization: false);
654  }
655  }
656  else
657  {
658  IAsyncResult asyncResult2 = beginMethod(arg1, delegate(IAsyncResult iar)
659  {
660  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
661  }, state);
662  }
663  }
664  catch
665  {
666  if (AsyncCausalityTracer.LoggingOn)
667  {
668  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, promise.Id, AsyncCausalityStatus.Error);
669  }
670  if (Task.s_asyncDebuggingEnabled)
671  {
672  Task.RemoveFromActiveTasks(promise.Id);
673  }
674  promise.TrySetResult(default(TResult));
675  throw;
676  }
677  return promise;
678  }
679 
690  [__DynamicallyInvokable]
691  public Task<TResult> FromAsync<TArg1, TArg2>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, object state)
692  {
693  return FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, state, m_defaultCreationOptions);
694  }
695 
708  [__DynamicallyInvokable]
709  public Task<TResult> FromAsync<TArg1, TArg2>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions)
710  {
711  return FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, state, creationOptions);
712  }
713 
714  internal static Task<TResult> FromAsyncImpl<TArg1, TArg2>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions)
715  {
716  if (beginMethod == null)
717  {
718  throw new ArgumentNullException("beginMethod");
719  }
720  if (endFunction == null && endAction == null)
721  {
722  throw new ArgumentNullException("endMethod");
723  }
724  TaskFactory.CheckFromAsyncOptions(creationOptions, hasBeginMethod: true);
725  Task<TResult> promise = new Task<TResult>(state, creationOptions);
726  if (AsyncCausalityTracer.LoggingOn)
727  {
728  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, promise.Id, "TaskFactory.FromAsync: " + beginMethod.Method.Name, 0uL);
729  }
730  if (Task.s_asyncDebuggingEnabled)
731  {
732  Task.AddToActiveTasks(promise);
733  }
734  try
735  {
736  if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
737  {
738  IAsyncResult asyncResult = beginMethod(arg1, arg2, delegate(IAsyncResult iar)
739  {
740  if (!iar.CompletedSynchronously)
741  {
742  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
743  }
744  }, state);
745  if (asyncResult.CompletedSynchronously)
746  {
747  FromAsyncCoreLogic(asyncResult, endFunction, endAction, promise, requiresSynchronization: false);
748  }
749  }
750  else
751  {
752  IAsyncResult asyncResult2 = beginMethod(arg1, arg2, delegate(IAsyncResult iar)
753  {
754  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
755  }, state);
756  }
757  }
758  catch
759  {
760  if (AsyncCausalityTracer.LoggingOn)
761  {
762  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, promise.Id, AsyncCausalityStatus.Error);
763  }
764  if (Task.s_asyncDebuggingEnabled)
765  {
766  Task.RemoveFromActiveTasks(promise.Id);
767  }
768  promise.TrySetResult(default(TResult));
769  throw;
770  }
771  return promise;
772  }
773 
786  [__DynamicallyInvokable]
787  public Task<TResult> FromAsync<TArg1, TArg2, TArg3>(Func<TArg1, TArg2, TArg3, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state)
788  {
789  return FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, arg3, state, m_defaultCreationOptions);
790  }
791 
806  [__DynamicallyInvokable]
807  public Task<TResult> FromAsync<TArg1, TArg2, TArg3>(Func<TArg1, TArg2, TArg3, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions)
808  {
809  return FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, arg3, state, creationOptions);
810  }
811 
812  internal static Task<TResult> FromAsyncImpl<TArg1, TArg2, TArg3>(Func<TArg1, TArg2, TArg3, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions)
813  {
814  if (beginMethod == null)
815  {
816  throw new ArgumentNullException("beginMethod");
817  }
818  if (endFunction == null && endAction == null)
819  {
820  throw new ArgumentNullException("endMethod");
821  }
822  TaskFactory.CheckFromAsyncOptions(creationOptions, hasBeginMethod: true);
823  Task<TResult> promise = new Task<TResult>(state, creationOptions);
824  if (AsyncCausalityTracer.LoggingOn)
825  {
826  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, promise.Id, "TaskFactory.FromAsync: " + beginMethod.Method.Name, 0uL);
827  }
828  if (Task.s_asyncDebuggingEnabled)
829  {
830  Task.AddToActiveTasks(promise);
831  }
832  try
833  {
834  if (BinaryCompatibility.TargetsAtLeast_Desktop_V4_5)
835  {
836  IAsyncResult asyncResult = beginMethod(arg1, arg2, arg3, delegate(IAsyncResult iar)
837  {
838  if (!iar.CompletedSynchronously)
839  {
840  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
841  }
842  }, state);
843  if (asyncResult.CompletedSynchronously)
844  {
845  FromAsyncCoreLogic(asyncResult, endFunction, endAction, promise, requiresSynchronization: false);
846  }
847  }
848  else
849  {
850  IAsyncResult asyncResult2 = beginMethod(arg1, arg2, arg3, delegate(IAsyncResult iar)
851  {
852  FromAsyncCoreLogic(iar, endFunction, endAction, promise, requiresSynchronization: true);
853  }, state);
854  }
855  }
856  catch
857  {
858  if (AsyncCausalityTracer.LoggingOn)
859  {
860  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, promise.Id, AsyncCausalityStatus.Error);
861  }
862  if (Task.s_asyncDebuggingEnabled)
863  {
864  Task.RemoveFromActiveTasks(promise.Id);
865  }
866  promise.TrySetResult(default(TResult));
867  throw;
868  }
869  return promise;
870  }
871 
872  internal static Task<TResult> FromAsyncTrim<TInstance, TArgs>(TInstance thisRef, TArgs args, Func<TInstance, TArgs, AsyncCallback, object, IAsyncResult> beginMethod, Func<TInstance, IAsyncResult, TResult> endMethod) where TInstance : class
873  {
874  FromAsyncTrimPromise<TInstance> fromAsyncTrimPromise = new FromAsyncTrimPromise<TInstance>(thisRef, endMethod);
875  IAsyncResult asyncResult = beginMethod(thisRef, args, FromAsyncTrimPromise<TInstance>.s_completeFromAsyncResult, fromAsyncTrimPromise);
876  if (asyncResult.CompletedSynchronously)
877  {
878  fromAsyncTrimPromise.Complete(thisRef, endMethod, asyncResult, requiresSynchronization: false);
879  }
880  return fromAsyncTrimPromise;
881  }
882 
883  private static Task<TResult> CreateCanceledTask(TaskContinuationOptions continuationOptions, CancellationToken ct)
884  {
885  Task.CreationOptionsFromContinuationOptions(continuationOptions, out TaskCreationOptions creationOptions, out InternalTaskOptions _);
886  return new Task<TResult>(canceled: true, default(TResult), creationOptions, ct);
887  }
888 
897  [MethodImpl(MethodImplOptions.NoInlining)]
898  [__DynamicallyInvokable]
899  public Task<TResult> ContinueWhenAll(Task[] tasks, Func<Task[], TResult> continuationFunction)
900  {
901  if (continuationFunction == null)
902  {
903  throw new ArgumentNullException("continuationFunction");
904  }
905  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
906  return ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
907  }
908 
918  [MethodImpl(MethodImplOptions.NoInlining)]
919  [__DynamicallyInvokable]
920  public Task<TResult> ContinueWhenAll(Task[] tasks, Func<Task[], TResult> continuationFunction, CancellationToken cancellationToken)
921  {
922  if (continuationFunction == null)
923  {
924  throw new ArgumentNullException("continuationFunction");
925  }
926  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
927  return ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
928  }
929 
939  [MethodImpl(MethodImplOptions.NoInlining)]
940  [__DynamicallyInvokable]
941  public Task<TResult> ContinueWhenAll(Task[] tasks, Func<Task[], TResult> continuationFunction, TaskContinuationOptions continuationOptions)
942  {
943  if (continuationFunction == null)
944  {
945  throw new ArgumentNullException("continuationFunction");
946  }
947  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
948  return ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
949  }
950 
963  [MethodImpl(MethodImplOptions.NoInlining)]
964  [__DynamicallyInvokable]
965  public Task<TResult> ContinueWhenAll(Task[] tasks, Func<Task[], TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
966  {
967  if (continuationFunction == null)
968  {
969  throw new ArgumentNullException("continuationFunction");
970  }
971  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
972  return ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
973  }
974 
983  [MethodImpl(MethodImplOptions.NoInlining)]
984  [__DynamicallyInvokable]
985  public Task<TResult> ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction)
986  {
987  if (continuationFunction == null)
988  {
989  throw new ArgumentNullException("continuationFunction");
990  }
991  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
992  return ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
993  }
994 
1004  [MethodImpl(MethodImplOptions.NoInlining)]
1005  [__DynamicallyInvokable]
1006  public Task<TResult> ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction, CancellationToken cancellationToken)
1007  {
1008  if (continuationFunction == null)
1009  {
1010  throw new ArgumentNullException("continuationFunction");
1011  }
1012  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1013  return ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
1014  }
1015 
1026  [MethodImpl(MethodImplOptions.NoInlining)]
1027  [__DynamicallyInvokable]
1028  public Task<TResult> ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction, TaskContinuationOptions continuationOptions)
1029  {
1030  if (continuationFunction == null)
1031  {
1032  throw new ArgumentNullException("continuationFunction");
1033  }
1034  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1035  return ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
1036  }
1037 
1050  [MethodImpl(MethodImplOptions.NoInlining)]
1051  [__DynamicallyInvokable]
1052  public Task<TResult> ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
1053  {
1054  if (continuationFunction == null)
1055  {
1056  throw new ArgumentNullException("continuationFunction");
1057  }
1058  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1059  return ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
1060  }
1061 
1062  internal static Task<TResult> ContinueWhenAllImpl<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction, Action<Task<TAntecedentResult>[]> continuationAction, TaskContinuationOptions continuationOptions, CancellationToken cancellationToken, TaskScheduler scheduler, ref StackCrawlMark stackMark)
1063  {
1064  TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions);
1065  if (tasks == null)
1066  {
1067  throw new ArgumentNullException("tasks");
1068  }
1069  if (scheduler == null)
1070  {
1071  throw new ArgumentNullException("scheduler");
1072  }
1073  Task<TAntecedentResult>[] tasksCopy = TaskFactory.CheckMultiContinuationTasksAndCopy(tasks);
1074  if (cancellationToken.IsCancellationRequested && (continuationOptions & TaskContinuationOptions.LazyCancellation) == TaskContinuationOptions.None)
1075  {
1076  return CreateCanceledTask(continuationOptions, cancellationToken);
1077  }
1078  Task<Task<TAntecedentResult>[]> task = TaskFactory.CommonCWAllLogic(tasksCopy);
1079  if (continuationFunction != null)
1080  {
1081  return task.ContinueWith(GenericDelegateCache<TAntecedentResult, TResult>.CWAllFuncDelegate, continuationFunction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1082  }
1083  return task.ContinueWith(GenericDelegateCache<TAntecedentResult, TResult>.CWAllActionDelegate, continuationAction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1084  }
1085 
1086  internal static Task<TResult> ContinueWhenAllImpl(Task[] tasks, Func<Task[], TResult> continuationFunction, Action<Task[]> continuationAction, TaskContinuationOptions continuationOptions, CancellationToken cancellationToken, TaskScheduler scheduler, ref StackCrawlMark stackMark)
1087  {
1088  TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions);
1089  if (tasks == null)
1090  {
1091  throw new ArgumentNullException("tasks");
1092  }
1093  if (scheduler == null)
1094  {
1095  throw new ArgumentNullException("scheduler");
1096  }
1097  Task[] tasksCopy = TaskFactory.CheckMultiContinuationTasksAndCopy(tasks);
1098  if (cancellationToken.IsCancellationRequested && (continuationOptions & TaskContinuationOptions.LazyCancellation) == TaskContinuationOptions.None)
1099  {
1100  return CreateCanceledTask(continuationOptions, cancellationToken);
1101  }
1102  Task<Task[]> task = TaskFactory.CommonCWAllLogic(tasksCopy);
1103  if (continuationFunction != null)
1104  {
1105  return task.ContinueWith(delegate(Task<Task[]> completedTasks, object state)
1106  {
1107  completedTasks.NotifyDebuggerOfWaitCompletionIfNecessary();
1108  return ((Func<Task[], TResult>)state)(completedTasks.Result);
1109  }, continuationFunction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1110  }
1111  return task.ContinueWith(delegate(Task<Task[]> completedTasks, object state)
1112  {
1113  completedTasks.NotifyDebuggerOfWaitCompletionIfNecessary();
1114  ((Action<Task[]>)state)(completedTasks.Result);
1115  return default(TResult);
1116  }, continuationAction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1117  }
1118 
1126  [MethodImpl(MethodImplOptions.NoInlining)]
1127  [__DynamicallyInvokable]
1128  public Task<TResult> ContinueWhenAny(Task[] tasks, Func<Task, TResult> continuationFunction)
1129  {
1130  if (continuationFunction == null)
1131  {
1132  throw new ArgumentNullException("continuationFunction");
1133  }
1134  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1135  return ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
1136  }
1137 
1146  [MethodImpl(MethodImplOptions.NoInlining)]
1147  [__DynamicallyInvokable]
1148  public Task<TResult> ContinueWhenAny(Task[] tasks, Func<Task, TResult> continuationFunction, CancellationToken cancellationToken)
1149  {
1150  if (continuationFunction == null)
1151  {
1152  throw new ArgumentNullException("continuationFunction");
1153  }
1154  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1155  return ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
1156  }
1157 
1167  [MethodImpl(MethodImplOptions.NoInlining)]
1168  [__DynamicallyInvokable]
1169  public Task<TResult> ContinueWhenAny(Task[] tasks, Func<Task, TResult> continuationFunction, TaskContinuationOptions continuationOptions)
1170  {
1171  if (continuationFunction == null)
1172  {
1173  throw new ArgumentNullException("continuationFunction");
1174  }
1175  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1176  return ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
1177  }
1178 
1190  [MethodImpl(MethodImplOptions.NoInlining)]
1191  [__DynamicallyInvokable]
1192  public Task<TResult> ContinueWhenAny(Task[] tasks, Func<Task, TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
1193  {
1194  if (continuationFunction == null)
1195  {
1196  throw new ArgumentNullException("continuationFunction");
1197  }
1198  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1199  return ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
1200  }
1201 
1210  [MethodImpl(MethodImplOptions.NoInlining)]
1211  [__DynamicallyInvokable]
1212  public Task<TResult> ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction)
1213  {
1214  if (continuationFunction == null)
1215  {
1216  throw new ArgumentNullException("continuationFunction");
1217  }
1218  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1219  return ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
1220  }
1221 
1231  [MethodImpl(MethodImplOptions.NoInlining)]
1232  [__DynamicallyInvokable]
1233  public Task<TResult> ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction, CancellationToken cancellationToken)
1234  {
1235  if (continuationFunction == null)
1236  {
1237  throw new ArgumentNullException("continuationFunction");
1238  }
1239  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1240  return ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
1241  }
1242 
1253  [MethodImpl(MethodImplOptions.NoInlining)]
1254  [__DynamicallyInvokable]
1255  public Task<TResult> ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction, TaskContinuationOptions continuationOptions)
1256  {
1257  if (continuationFunction == null)
1258  {
1259  throw new ArgumentNullException("continuationFunction");
1260  }
1261  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1262  return ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
1263  }
1264 
1277  [MethodImpl(MethodImplOptions.NoInlining)]
1278  [__DynamicallyInvokable]
1279  public Task<TResult> ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
1280  {
1281  if (continuationFunction == null)
1282  {
1283  throw new ArgumentNullException("continuationFunction");
1284  }
1285  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1286  return ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
1287  }
1288 
1289  internal static Task<TResult> ContinueWhenAnyImpl(Task[] tasks, Func<Task, TResult> continuationFunction, Action<Task> continuationAction, TaskContinuationOptions continuationOptions, CancellationToken cancellationToken, TaskScheduler scheduler, ref StackCrawlMark stackMark)
1290  {
1291  TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions);
1292  if (tasks == null)
1293  {
1294  throw new ArgumentNullException("tasks");
1295  }
1296  if (tasks.Length == 0)
1297  {
1298  throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks");
1299  }
1300  if (scheduler == null)
1301  {
1302  throw new ArgumentNullException("scheduler");
1303  }
1304  Task<Task> task = TaskFactory.CommonCWAnyLogic(tasks);
1305  if (cancellationToken.IsCancellationRequested && (continuationOptions & TaskContinuationOptions.LazyCancellation) == TaskContinuationOptions.None)
1306  {
1307  return CreateCanceledTask(continuationOptions, cancellationToken);
1308  }
1309  if (continuationFunction != null)
1310  {
1311  return task.ContinueWith((Task<Task> completedTask, object state) => ((Func<Task, TResult>)state)(completedTask.Result), continuationFunction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1312  }
1313  return task.ContinueWith(delegate(Task<Task> completedTask, object state)
1314  {
1315  ((Action<Task>)state)(completedTask.Result);
1316  return default(TResult);
1317  }, continuationAction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1318  }
1319 
1320  internal static Task<TResult> ContinueWhenAnyImpl<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction, Action<Task<TAntecedentResult>> continuationAction, TaskContinuationOptions continuationOptions, CancellationToken cancellationToken, TaskScheduler scheduler, ref StackCrawlMark stackMark)
1321  {
1322  TaskFactory.CheckMultiTaskContinuationOptions(continuationOptions);
1323  if (tasks == null)
1324  {
1325  throw new ArgumentNullException("tasks");
1326  }
1327  if (tasks.Length == 0)
1328  {
1329  throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks");
1330  }
1331  if (scheduler == null)
1332  {
1333  throw new ArgumentNullException("scheduler");
1334  }
1335  Task<Task> task = TaskFactory.CommonCWAnyLogic(tasks);
1336  if (cancellationToken.IsCancellationRequested && (continuationOptions & TaskContinuationOptions.LazyCancellation) == TaskContinuationOptions.None)
1337  {
1338  return CreateCanceledTask(continuationOptions, cancellationToken);
1339  }
1340  if (continuationFunction != null)
1341  {
1342  return task.ContinueWith(GenericDelegateCache<TAntecedentResult, TResult>.CWAnyFuncDelegate, continuationFunction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1343  }
1344  return task.ContinueWith(GenericDelegateCache<TAntecedentResult, TResult>.CWAnyActionDelegate, continuationAction, scheduler, cancellationToken, continuationOptions, ref stackMark);
1345  }
1346  }
1348  [__DynamicallyInvokable]
1349  [HostProtection(SecurityAction.LinkDemand, Synchronization = true, ExternalThreading = true)]
1350  public class TaskFactory
1351  {
1352  private sealed class CompleteOnCountdownPromise : Task<Task[]>, ITaskCompletionAction
1353  {
1354  private readonly Task[] _tasks;
1355 
1356  private int _count;
1357 
1358  internal override bool ShouldNotifyDebuggerOfWaitCompletion
1359  {
1360  get
1361  {
1362  if (base.ShouldNotifyDebuggerOfWaitCompletion)
1363  {
1364  return Task.AnyTaskRequiresNotifyDebuggerOfWaitCompletion(_tasks);
1365  }
1366  return false;
1367  }
1368  }
1369 
1370  internal CompleteOnCountdownPromise(Task[] tasksCopy)
1371  {
1372  _tasks = tasksCopy;
1373  _count = tasksCopy.Length;
1374  if (AsyncCausalityTracer.LoggingOn)
1375  {
1376  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, base.Id, "TaskFactory.ContinueWhenAll", 0uL);
1377  }
1378  if (Task.s_asyncDebuggingEnabled)
1379  {
1380  Task.AddToActiveTasks(this);
1381  }
1382  }
1383 
1384  public void Invoke(Task completingTask)
1385  {
1386  if (AsyncCausalityTracer.LoggingOn)
1387  {
1388  AsyncCausalityTracer.TraceOperationRelation(CausalityTraceLevel.Important, base.Id, CausalityRelation.Join);
1389  }
1390  if (completingTask.IsWaitNotificationEnabled)
1391  {
1392  SetNotificationForWaitCompletion(enabled: true);
1393  }
1394  if (Interlocked.Decrement(ref _count) == 0)
1395  {
1396  if (AsyncCausalityTracer.LoggingOn)
1397  {
1398  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, base.Id, AsyncCausalityStatus.Completed);
1399  }
1400  if (Task.s_asyncDebuggingEnabled)
1401  {
1402  Task.RemoveFromActiveTasks(base.Id);
1403  }
1404  TrySetResult(_tasks);
1405  }
1406  }
1407  }
1408 
1409  private sealed class CompleteOnCountdownPromise<T> : Task<Task<T>[]>, ITaskCompletionAction
1410  {
1411  private readonly Task<T>[] _tasks;
1412 
1413  private int _count;
1414 
1415  internal override bool ShouldNotifyDebuggerOfWaitCompletion
1416  {
1417  get
1418  {
1419  if (base.ShouldNotifyDebuggerOfWaitCompletion)
1420  {
1421  return Task.AnyTaskRequiresNotifyDebuggerOfWaitCompletion(_tasks);
1422  }
1423  return false;
1424  }
1425  }
1426 
1427  internal CompleteOnCountdownPromise(Task<T>[] tasksCopy)
1428  {
1429  _tasks = tasksCopy;
1430  _count = tasksCopy.Length;
1431  if (AsyncCausalityTracer.LoggingOn)
1432  {
1433  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, base.Id, "TaskFactory.ContinueWhenAll<>", 0uL);
1434  }
1435  if (Task.s_asyncDebuggingEnabled)
1436  {
1437  Task.AddToActiveTasks(this);
1438  }
1439  }
1440 
1441  public void Invoke(Task completingTask)
1442  {
1443  if (AsyncCausalityTracer.LoggingOn)
1444  {
1445  AsyncCausalityTracer.TraceOperationRelation(CausalityTraceLevel.Important, base.Id, CausalityRelation.Join);
1446  }
1447  if (completingTask.IsWaitNotificationEnabled)
1448  {
1449  SetNotificationForWaitCompletion(enabled: true);
1450  }
1451  if (Interlocked.Decrement(ref _count) == 0)
1452  {
1453  if (AsyncCausalityTracer.LoggingOn)
1454  {
1455  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, base.Id, AsyncCausalityStatus.Completed);
1456  }
1457  if (Task.s_asyncDebuggingEnabled)
1458  {
1459  Task.RemoveFromActiveTasks(base.Id);
1460  }
1461  TrySetResult(_tasks);
1462  }
1463  }
1464  }
1465 
1466  internal sealed class CompleteOnInvokePromise : Task<Task>, ITaskCompletionAction
1467  {
1468  private IList<Task> _tasks;
1469 
1470  private int m_firstTaskAlreadyCompleted;
1471 
1472  public CompleteOnInvokePromise(IList<Task> tasks)
1473  {
1474  _tasks = tasks;
1475  if (AsyncCausalityTracer.LoggingOn)
1476  {
1477  AsyncCausalityTracer.TraceOperationCreation(CausalityTraceLevel.Required, base.Id, "TaskFactory.ContinueWhenAny", 0uL);
1478  }
1479  if (Task.s_asyncDebuggingEnabled)
1480  {
1481  Task.AddToActiveTasks(this);
1482  }
1483  }
1484 
1485  public void Invoke(Task completingTask)
1486  {
1487  if (Interlocked.CompareExchange(ref m_firstTaskAlreadyCompleted, 1, 0) != 0)
1488  {
1489  return;
1490  }
1491  if (AsyncCausalityTracer.LoggingOn)
1492  {
1493  AsyncCausalityTracer.TraceOperationRelation(CausalityTraceLevel.Important, base.Id, CausalityRelation.Choice);
1494  AsyncCausalityTracer.TraceOperationCompletion(CausalityTraceLevel.Required, base.Id, AsyncCausalityStatus.Completed);
1495  }
1496  if (Task.s_asyncDebuggingEnabled)
1497  {
1498  Task.RemoveFromActiveTasks(base.Id);
1499  }
1500  bool flag = TrySetResult(completingTask);
1501  IList<Task> tasks = _tasks;
1502  int count = tasks.Count;
1503  for (int i = 0; i < count; i++)
1504  {
1505  Task task = tasks[i];
1506  if (task != null && !task.IsCompleted)
1507  {
1508  task.RemoveContinuation(this);
1509  }
1510  }
1511  _tasks = null;
1512  }
1513  }
1514 
1515  private CancellationToken m_defaultCancellationToken;
1516 
1517  private TaskScheduler m_defaultScheduler;
1518 
1519  private TaskCreationOptions m_defaultCreationOptions;
1520 
1521  private TaskContinuationOptions m_defaultContinuationOptions;
1522 
1523  private TaskScheduler DefaultScheduler
1524  {
1525  get
1526  {
1527  if (m_defaultScheduler == null)
1528  {
1529  return TaskScheduler.Current;
1530  }
1531  return m_defaultScheduler;
1532  }
1533  }
1534 
1537  [__DynamicallyInvokable]
1538  public CancellationToken CancellationToken
1539  {
1540  [__DynamicallyInvokable]
1541  get
1542  {
1543  return m_defaultCancellationToken;
1544  }
1545  }
1546 
1549  [__DynamicallyInvokable]
1550  public TaskScheduler Scheduler
1551  {
1552  [__DynamicallyInvokable]
1553  get
1554  {
1555  return m_defaultScheduler;
1556  }
1557  }
1558 
1561  [__DynamicallyInvokable]
1562  public TaskCreationOptions CreationOptions
1563  {
1564  [__DynamicallyInvokable]
1565  get
1566  {
1567  return m_defaultCreationOptions;
1568  }
1569  }
1570 
1573  [__DynamicallyInvokable]
1574  public TaskContinuationOptions ContinuationOptions
1575  {
1576  [__DynamicallyInvokable]
1577  get
1578  {
1579  return m_defaultContinuationOptions;
1580  }
1581  }
1582 
1583  private TaskScheduler GetDefaultScheduler(Task currTask)
1584  {
1585  if (m_defaultScheduler != null)
1586  {
1587  return m_defaultScheduler;
1588  }
1589  if (currTask != null && (currTask.CreationOptions & TaskCreationOptions.HideScheduler) == TaskCreationOptions.None)
1590  {
1591  return currTask.ExecutingTaskScheduler;
1592  }
1593  return TaskScheduler.Default;
1594  }
1595 
1597  [__DynamicallyInvokable]
1598  public TaskFactory()
1600  {
1601  }
1602 
1605  [__DynamicallyInvokable]
1606  public TaskFactory(CancellationToken cancellationToken)
1607  : this(cancellationToken, TaskCreationOptions.None, TaskContinuationOptions.None, null)
1608  {
1609  }
1610 
1613  [__DynamicallyInvokable]
1614  public TaskFactory(TaskScheduler scheduler)
1616  {
1617  }
1618 
1623  [__DynamicallyInvokable]
1624  public TaskFactory(TaskCreationOptions creationOptions, TaskContinuationOptions continuationOptions)
1625  : this(default(CancellationToken), creationOptions, continuationOptions, null)
1626  {
1627  }
1628 
1635  [__DynamicallyInvokable]
1636  public TaskFactory(CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
1637  {
1638  CheckMultiTaskContinuationOptions(continuationOptions);
1639  CheckCreationOptions(creationOptions);
1640  m_defaultCancellationToken = cancellationToken;
1641  m_defaultScheduler = scheduler;
1642  m_defaultCreationOptions = creationOptions;
1643  m_defaultContinuationOptions = continuationOptions;
1644  }
1645 
1646  internal static void CheckCreationOptions(TaskCreationOptions creationOptions)
1647  {
1648  if ((creationOptions & ~(TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent | TaskCreationOptions.DenyChildAttach | TaskCreationOptions.HideScheduler | TaskCreationOptions.RunContinuationsAsynchronously)) != 0)
1649  {
1650  throw new ArgumentOutOfRangeException("creationOptions");
1651  }
1652  }
1653 
1658  [MethodImpl(MethodImplOptions.NoInlining)]
1659  [__DynamicallyInvokable]
1660  public Task StartNew(Action action)
1661  {
1662  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1663  Task internalCurrent = Task.InternalCurrent;
1664  return Task.InternalStartNew(internalCurrent, action, null, m_defaultCancellationToken, GetDefaultScheduler(internalCurrent), m_defaultCreationOptions, InternalTaskOptions.None, ref stackMark);
1665  }
1666 
1673  [MethodImpl(MethodImplOptions.NoInlining)]
1674  [__DynamicallyInvokable]
1675  public Task StartNew(Action action, CancellationToken cancellationToken)
1676  {
1677  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1678  Task internalCurrent = Task.InternalCurrent;
1679  return Task.InternalStartNew(internalCurrent, action, null, cancellationToken, GetDefaultScheduler(internalCurrent), m_defaultCreationOptions, InternalTaskOptions.None, ref stackMark);
1680  }
1681 
1688  [MethodImpl(MethodImplOptions.NoInlining)]
1689  [__DynamicallyInvokable]
1690  public Task StartNew(Action action, TaskCreationOptions creationOptions)
1691  {
1692  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1693  Task internalCurrent = Task.InternalCurrent;
1694  return Task.InternalStartNew(internalCurrent, action, null, m_defaultCancellationToken, GetDefaultScheduler(internalCurrent), creationOptions, InternalTaskOptions.None, ref stackMark);
1695  }
1696 
1706  [MethodImpl(MethodImplOptions.NoInlining)]
1707  [__DynamicallyInvokable]
1708  public Task StartNew(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
1709  {
1710  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1711  return Task.InternalStartNew(Task.InternalCurrentIfAttached(creationOptions), action, null, cancellationToken, scheduler, creationOptions, InternalTaskOptions.None, ref stackMark);
1712  }
1713 
1714  [MethodImpl(MethodImplOptions.NoInlining)]
1715  internal Task StartNew(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, InternalTaskOptions internalOptions, TaskScheduler scheduler)
1716  {
1717  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1718  return Task.InternalStartNew(Task.InternalCurrentIfAttached(creationOptions), action, null, cancellationToken, scheduler, creationOptions, internalOptions, ref stackMark);
1719  }
1720 
1726  [MethodImpl(MethodImplOptions.NoInlining)]
1727  [__DynamicallyInvokable]
1728  public Task StartNew(Action<object> action, object state)
1729  {
1730  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1731  Task internalCurrent = Task.InternalCurrent;
1732  return Task.InternalStartNew(internalCurrent, action, state, m_defaultCancellationToken, GetDefaultScheduler(internalCurrent), m_defaultCreationOptions, InternalTaskOptions.None, ref stackMark);
1733  }
1734 
1742  [MethodImpl(MethodImplOptions.NoInlining)]
1743  [__DynamicallyInvokable]
1744  public Task StartNew(Action<object> action, object state, CancellationToken cancellationToken)
1745  {
1746  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1747  Task internalCurrent = Task.InternalCurrent;
1748  return Task.InternalStartNew(internalCurrent, action, state, cancellationToken, GetDefaultScheduler(internalCurrent), m_defaultCreationOptions, InternalTaskOptions.None, ref stackMark);
1749  }
1750 
1758  [MethodImpl(MethodImplOptions.NoInlining)]
1759  [__DynamicallyInvokable]
1760  public Task StartNew(Action<object> action, object state, TaskCreationOptions creationOptions)
1761  {
1762  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1763  Task internalCurrent = Task.InternalCurrent;
1764  return Task.InternalStartNew(internalCurrent, action, state, m_defaultCancellationToken, GetDefaultScheduler(internalCurrent), creationOptions, InternalTaskOptions.None, ref stackMark);
1765  }
1766 
1777  [MethodImpl(MethodImplOptions.NoInlining)]
1778  [__DynamicallyInvokable]
1779  public Task StartNew(Action<object> action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
1780  {
1781  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1782  return Task.InternalStartNew(Task.InternalCurrentIfAttached(creationOptions), action, state, cancellationToken, scheduler, creationOptions, InternalTaskOptions.None, ref stackMark);
1783  }
1784 
1790  [MethodImpl(MethodImplOptions.NoInlining)]
1791  [__DynamicallyInvokable]
1792  public Task<TResult> StartNew<TResult>(Func<TResult> function)
1793  {
1794  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1795  Task internalCurrent = Task.InternalCurrent;
1796  return Task<TResult>.StartNew(internalCurrent, function, m_defaultCancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
1797  }
1798 
1806  [MethodImpl(MethodImplOptions.NoInlining)]
1807  [__DynamicallyInvokable]
1808  public Task<TResult> StartNew<TResult>(Func<TResult> function, CancellationToken cancellationToken)
1809  {
1810  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1811  Task internalCurrent = Task.InternalCurrent;
1812  return Task<TResult>.StartNew(internalCurrent, function, cancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
1813  }
1814 
1822  [MethodImpl(MethodImplOptions.NoInlining)]
1823  [__DynamicallyInvokable]
1824  public Task<TResult> StartNew<TResult>(Func<TResult> function, TaskCreationOptions creationOptions)
1825  {
1826  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1827  Task internalCurrent = Task.InternalCurrent;
1828  return Task<TResult>.StartNew(internalCurrent, function, m_defaultCancellationToken, creationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
1829  }
1830 
1841  [MethodImpl(MethodImplOptions.NoInlining)]
1842  [__DynamicallyInvokable]
1843  public Task<TResult> StartNew<TResult>(Func<TResult> function, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
1844  {
1845  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1846  return Task<TResult>.StartNew(Task.InternalCurrentIfAttached(creationOptions), function, cancellationToken, creationOptions, InternalTaskOptions.None, scheduler, ref stackMark);
1847  }
1848 
1855  [MethodImpl(MethodImplOptions.NoInlining)]
1856  [__DynamicallyInvokable]
1857  public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state)
1858  {
1859  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1860  Task internalCurrent = Task.InternalCurrent;
1861  return Task<TResult>.StartNew(internalCurrent, function, state, m_defaultCancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
1862  }
1863 
1872  [MethodImpl(MethodImplOptions.NoInlining)]
1873  [__DynamicallyInvokable]
1874  public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state, CancellationToken cancellationToken)
1875  {
1876  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1877  Task internalCurrent = Task.InternalCurrent;
1878  return Task<TResult>.StartNew(internalCurrent, function, state, cancellationToken, m_defaultCreationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
1879  }
1880 
1889  [MethodImpl(MethodImplOptions.NoInlining)]
1890  [__DynamicallyInvokable]
1891  public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state, TaskCreationOptions creationOptions)
1892  {
1893  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1894  Task internalCurrent = Task.InternalCurrent;
1895  return Task<TResult>.StartNew(internalCurrent, function, state, m_defaultCancellationToken, creationOptions, InternalTaskOptions.None, GetDefaultScheduler(internalCurrent), ref stackMark);
1896  }
1897 
1909  [MethodImpl(MethodImplOptions.NoInlining)]
1910  [__DynamicallyInvokable]
1911  public Task<TResult> StartNew<TResult>(Func<object, TResult> function, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
1912  {
1913  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1914  return Task<TResult>.StartNew(Task.InternalCurrentIfAttached(creationOptions), function, state, cancellationToken, creationOptions, InternalTaskOptions.None, scheduler, ref stackMark);
1915  }
1916 
1922  [MethodImpl(MethodImplOptions.NoInlining)]
1923  [__DynamicallyInvokable]
1924  public Task FromAsync(IAsyncResult asyncResult, Action<IAsyncResult> endMethod)
1925  {
1926  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1927  return FromAsync(asyncResult, endMethod, m_defaultCreationOptions, DefaultScheduler, ref stackMark);
1928  }
1929 
1937  [MethodImpl(MethodImplOptions.NoInlining)]
1938  [__DynamicallyInvokable]
1939  public Task FromAsync(IAsyncResult asyncResult, Action<IAsyncResult> endMethod, TaskCreationOptions creationOptions)
1940  {
1941  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1942  return FromAsync(asyncResult, endMethod, creationOptions, DefaultScheduler, ref stackMark);
1943  }
1944 
1953  [MethodImpl(MethodImplOptions.NoInlining)]
1954  [__DynamicallyInvokable]
1955  public Task FromAsync(IAsyncResult asyncResult, Action<IAsyncResult> endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler)
1956  {
1957  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
1958  return FromAsync(asyncResult, endMethod, creationOptions, scheduler, ref stackMark);
1959  }
1960 
1961  private Task FromAsync(IAsyncResult asyncResult, Action<IAsyncResult> endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler, ref StackCrawlMark stackMark)
1962  {
1963  return TaskFactory<VoidTaskResult>.FromAsyncImpl(asyncResult, null, endMethod, creationOptions, scheduler, ref stackMark);
1964  }
1965 
1972  [__DynamicallyInvokable]
1973  public Task FromAsync(Func<AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, object state)
1974  {
1975  return FromAsync(beginMethod, endMethod, state, m_defaultCreationOptions);
1976  }
1977 
1986  [__DynamicallyInvokable]
1987  public Task FromAsync(Func<AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, object state, TaskCreationOptions creationOptions)
1988  {
1989  return TaskFactory<VoidTaskResult>.FromAsyncImpl(beginMethod, null, endMethod, state, creationOptions);
1990  }
1991 
2000  [__DynamicallyInvokable]
2001  public Task FromAsync<TArg1>(Func<TArg1, AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, TArg1 arg1, object state)
2002  {
2003  return FromAsync(beginMethod, endMethod, arg1, state, m_defaultCreationOptions);
2004  }
2005 
2016  [__DynamicallyInvokable]
2017  public Task FromAsync<TArg1>(Func<TArg1, AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, TArg1 arg1, object state, TaskCreationOptions creationOptions)
2018  {
2019  return TaskFactory<VoidTaskResult>.FromAsyncImpl(beginMethod, null, endMethod, arg1, state, creationOptions);
2020  }
2021 
2032  [__DynamicallyInvokable]
2033  public Task FromAsync<TArg1, TArg2>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, TArg1 arg1, TArg2 arg2, object state)
2034  {
2035  return FromAsync(beginMethod, endMethod, arg1, arg2, state, m_defaultCreationOptions);
2036  }
2037 
2050  [__DynamicallyInvokable]
2051  public Task FromAsync<TArg1, TArg2>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions)
2052  {
2053  return TaskFactory<VoidTaskResult>.FromAsyncImpl(beginMethod, null, endMethod, arg1, arg2, state, creationOptions);
2054  }
2055 
2068  [__DynamicallyInvokable]
2069  public Task FromAsync<TArg1, TArg2, TArg3>(Func<TArg1, TArg2, TArg3, AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state)
2070  {
2071  return FromAsync(beginMethod, endMethod, arg1, arg2, arg3, state, m_defaultCreationOptions);
2072  }
2073 
2088  [__DynamicallyInvokable]
2089  public Task FromAsync<TArg1, TArg2, TArg3>(Func<TArg1, TArg2, TArg3, AsyncCallback, object, IAsyncResult> beginMethod, Action<IAsyncResult> endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions)
2090  {
2091  return TaskFactory<VoidTaskResult>.FromAsyncImpl(beginMethod, null, endMethod, arg1, arg2, arg3, state, creationOptions);
2092  }
2093 
2100  [MethodImpl(MethodImplOptions.NoInlining)]
2101  [__DynamicallyInvokable]
2102  public Task<TResult> FromAsync<TResult>(IAsyncResult asyncResult, Func<IAsyncResult, TResult> endMethod)
2103  {
2104  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2105  return TaskFactory<TResult>.FromAsyncImpl(asyncResult, endMethod, null, m_defaultCreationOptions, DefaultScheduler, ref stackMark);
2106  }
2107 
2116  [MethodImpl(MethodImplOptions.NoInlining)]
2117  [__DynamicallyInvokable]
2118  public Task<TResult> FromAsync<TResult>(IAsyncResult asyncResult, Func<IAsyncResult, TResult> endMethod, TaskCreationOptions creationOptions)
2119  {
2120  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2121  return TaskFactory<TResult>.FromAsyncImpl(asyncResult, endMethod, null, creationOptions, DefaultScheduler, ref stackMark);
2122  }
2123 
2133  [MethodImpl(MethodImplOptions.NoInlining)]
2134  [__DynamicallyInvokable]
2135  public Task<TResult> FromAsync<TResult>(IAsyncResult asyncResult, Func<IAsyncResult, TResult> endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler)
2136  {
2137  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2138  return TaskFactory<TResult>.FromAsyncImpl(asyncResult, endMethod, null, creationOptions, scheduler, ref stackMark);
2139  }
2140 
2148  [__DynamicallyInvokable]
2149  public Task<TResult> FromAsync<TResult>(Func<AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, object state)
2150  {
2151  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, state, m_defaultCreationOptions);
2152  }
2153 
2163  [__DynamicallyInvokable]
2164  public Task<TResult> FromAsync<TResult>(Func<AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, object state, TaskCreationOptions creationOptions)
2165  {
2166  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, state, creationOptions);
2167  }
2168 
2178  [__DynamicallyInvokable]
2179  public Task<TResult> FromAsync<TArg1, TResult>(Func<TArg1, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, object state)
2180  {
2181  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, arg1, state, m_defaultCreationOptions);
2182  }
2183 
2195  [__DynamicallyInvokable]
2196  public Task<TResult> FromAsync<TArg1, TResult>(Func<TArg1, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, object state, TaskCreationOptions creationOptions)
2197  {
2198  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, arg1, state, creationOptions);
2199  }
2200 
2212  [__DynamicallyInvokable]
2213  public Task<TResult> FromAsync<TArg1, TArg2, TResult>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, object state)
2214  {
2215  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, state, m_defaultCreationOptions);
2216  }
2217 
2231  [__DynamicallyInvokable]
2232  public Task<TResult> FromAsync<TArg1, TArg2, TResult>(Func<TArg1, TArg2, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, object state, TaskCreationOptions creationOptions)
2233  {
2234  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, state, creationOptions);
2235  }
2236 
2250  [__DynamicallyInvokable]
2251  public Task<TResult> FromAsync<TArg1, TArg2, TArg3, TResult>(Func<TArg1, TArg2, TArg3, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state)
2252  {
2253  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, arg3, state, m_defaultCreationOptions);
2254  }
2255 
2271  [__DynamicallyInvokable]
2272  public Task<TResult> FromAsync<TArg1, TArg2, TArg3, TResult>(Func<TArg1, TArg2, TArg3, AsyncCallback, object, IAsyncResult> beginMethod, Func<IAsyncResult, TResult> endMethod, TArg1 arg1, TArg2 arg2, TArg3 arg3, object state, TaskCreationOptions creationOptions)
2273  {
2274  return TaskFactory<TResult>.FromAsyncImpl(beginMethod, endMethod, null, arg1, arg2, arg3, state, creationOptions);
2275  }
2276 
2277  internal static void CheckFromAsyncOptions(TaskCreationOptions creationOptions, bool hasBeginMethod)
2278  {
2279  if (hasBeginMethod)
2280  {
2281  if ((creationOptions & TaskCreationOptions.LongRunning) != 0)
2282  {
2283  throw new ArgumentOutOfRangeException("creationOptions", Environment.GetResourceString("Task_FromAsync_LongRunning"));
2284  }
2285  if ((creationOptions & TaskCreationOptions.PreferFairness) != 0)
2286  {
2287  throw new ArgumentOutOfRangeException("creationOptions", Environment.GetResourceString("Task_FromAsync_PreferFairness"));
2288  }
2289  }
2290  if ((creationOptions & ~(TaskCreationOptions.PreferFairness | TaskCreationOptions.LongRunning | TaskCreationOptions.AttachedToParent | TaskCreationOptions.DenyChildAttach | TaskCreationOptions.HideScheduler)) != 0)
2291  {
2292  throw new ArgumentOutOfRangeException("creationOptions");
2293  }
2294  }
2295 
2296  internal static Task<Task[]> CommonCWAllLogic(Task[] tasksCopy)
2297  {
2298  CompleteOnCountdownPromise completeOnCountdownPromise = new CompleteOnCountdownPromise(tasksCopy);
2299  for (int i = 0; i < tasksCopy.Length; i++)
2300  {
2301  if (tasksCopy[i].IsCompleted)
2302  {
2303  completeOnCountdownPromise.Invoke(tasksCopy[i]);
2304  }
2305  else
2306  {
2307  tasksCopy[i].AddCompletionAction(completeOnCountdownPromise);
2308  }
2309  }
2310  return completeOnCountdownPromise;
2311  }
2312 
2313  internal static Task<Task<T>[]> CommonCWAllLogic<T>(Task<T>[] tasksCopy)
2314  {
2315  CompleteOnCountdownPromise<T> completeOnCountdownPromise = new CompleteOnCountdownPromise<T>(tasksCopy);
2316  for (int i = 0; i < tasksCopy.Length; i++)
2317  {
2318  if (tasksCopy[i].IsCompleted)
2319  {
2320  completeOnCountdownPromise.Invoke(tasksCopy[i]);
2321  }
2322  else
2323  {
2324  tasksCopy[i].AddCompletionAction(completeOnCountdownPromise);
2325  }
2326  }
2327  return completeOnCountdownPromise;
2328  }
2329 
2337  [MethodImpl(MethodImplOptions.NoInlining)]
2338  [__DynamicallyInvokable]
2339  public Task ContinueWhenAll(Task[] tasks, Action<Task[]> continuationAction)
2340  {
2341  if (continuationAction == null)
2342  {
2343  throw new ArgumentNullException("continuationAction");
2344  }
2345  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2346  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2347  }
2348 
2357  [MethodImpl(MethodImplOptions.NoInlining)]
2358  [__DynamicallyInvokable]
2359  public Task ContinueWhenAll(Task[] tasks, Action<Task[]> continuationAction, CancellationToken cancellationToken)
2360  {
2361  if (continuationAction == null)
2362  {
2363  throw new ArgumentNullException("continuationAction");
2364  }
2365  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2366  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
2367  }
2368 
2378  [MethodImpl(MethodImplOptions.NoInlining)]
2379  [__DynamicallyInvokable]
2380  public Task ContinueWhenAll(Task[] tasks, Action<Task[]> continuationAction, TaskContinuationOptions continuationOptions)
2381  {
2382  if (continuationAction == null)
2383  {
2384  throw new ArgumentNullException("continuationAction");
2385  }
2386  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2387  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2388  }
2389 
2399  [MethodImpl(MethodImplOptions.NoInlining)]
2400  [__DynamicallyInvokable]
2401  public Task ContinueWhenAll(Task[] tasks, Action<Task[]> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
2402  {
2403  if (continuationAction == null)
2404  {
2405  throw new ArgumentNullException("continuationAction");
2406  }
2407  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2408  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, continuationOptions, cancellationToken, scheduler, ref stackMark);
2409  }
2410 
2419  [MethodImpl(MethodImplOptions.NoInlining)]
2420  [__DynamicallyInvokable]
2421  public Task ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>[]> continuationAction)
2422  {
2423  if (continuationAction == null)
2424  {
2425  throw new ArgumentNullException("continuationAction");
2426  }
2427  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2428  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2429  }
2430 
2440  [MethodImpl(MethodImplOptions.NoInlining)]
2441  [__DynamicallyInvokable]
2442  public Task ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>[]> continuationAction, CancellationToken cancellationToken)
2443  {
2444  if (continuationAction == null)
2445  {
2446  throw new ArgumentNullException("continuationAction");
2447  }
2448  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2449  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
2450  }
2451 
2462  [MethodImpl(MethodImplOptions.NoInlining)]
2463  [__DynamicallyInvokable]
2464  public Task ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>[]> continuationAction, TaskContinuationOptions continuationOptions)
2465  {
2466  if (continuationAction == null)
2467  {
2468  throw new ArgumentNullException("continuationAction");
2469  }
2470  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2471  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2472  }
2473 
2484  [MethodImpl(MethodImplOptions.NoInlining)]
2485  [__DynamicallyInvokable]
2486  public Task ContinueWhenAll<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>[]> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
2487  {
2488  if (continuationAction == null)
2489  {
2490  throw new ArgumentNullException("continuationAction");
2491  }
2492  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2493  return TaskFactory<VoidTaskResult>.ContinueWhenAllImpl(tasks, null, continuationAction, continuationOptions, cancellationToken, scheduler, ref stackMark);
2494  }
2495 
2504  [MethodImpl(MethodImplOptions.NoInlining)]
2505  [__DynamicallyInvokable]
2506  public Task<TResult> ContinueWhenAll<TResult>(Task[] tasks, Func<Task[], TResult> continuationFunction)
2507  {
2508  if (continuationFunction == null)
2509  {
2510  throw new ArgumentNullException("continuationFunction");
2511  }
2512  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2513  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2514  }
2515 
2525  [MethodImpl(MethodImplOptions.NoInlining)]
2526  [__DynamicallyInvokable]
2527  public Task<TResult> ContinueWhenAll<TResult>(Task[] tasks, Func<Task[], TResult> continuationFunction, CancellationToken cancellationToken)
2528  {
2529  if (continuationFunction == null)
2530  {
2531  throw new ArgumentNullException("continuationFunction");
2532  }
2533  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2534  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
2535  }
2536 
2547  [MethodImpl(MethodImplOptions.NoInlining)]
2548  [__DynamicallyInvokable]
2549  public Task<TResult> ContinueWhenAll<TResult>(Task[] tasks, Func<Task[], TResult> continuationFunction, TaskContinuationOptions continuationOptions)
2550  {
2551  if (continuationFunction == null)
2552  {
2553  throw new ArgumentNullException("continuationFunction");
2554  }
2555  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2556  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2557  }
2558 
2569  [MethodImpl(MethodImplOptions.NoInlining)]
2570  [__DynamicallyInvokable]
2571  public Task<TResult> ContinueWhenAll<TResult>(Task[] tasks, Func<Task[], TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
2572  {
2573  if (continuationFunction == null)
2574  {
2575  throw new ArgumentNullException("continuationFunction");
2576  }
2577  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2578  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
2579  }
2580 
2590  [MethodImpl(MethodImplOptions.NoInlining)]
2591  [__DynamicallyInvokable]
2592  public Task<TResult> ContinueWhenAll<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction)
2593  {
2594  if (continuationFunction == null)
2595  {
2596  throw new ArgumentNullException("continuationFunction");
2597  }
2598  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2599  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2600  }
2601 
2612  [MethodImpl(MethodImplOptions.NoInlining)]
2613  [__DynamicallyInvokable]
2614  public Task<TResult> ContinueWhenAll<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction, CancellationToken cancellationToken)
2615  {
2616  if (continuationFunction == null)
2617  {
2618  throw new ArgumentNullException("continuationFunction");
2619  }
2620  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2621  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
2622  }
2623 
2635  [MethodImpl(MethodImplOptions.NoInlining)]
2636  [__DynamicallyInvokable]
2637  public Task<TResult> ContinueWhenAll<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction, TaskContinuationOptions continuationOptions)
2638  {
2639  if (continuationFunction == null)
2640  {
2641  throw new ArgumentNullException("continuationFunction");
2642  }
2643  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2644  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2645  }
2646 
2660  [MethodImpl(MethodImplOptions.NoInlining)]
2661  [__DynamicallyInvokable]
2662  public Task<TResult> ContinueWhenAll<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>[], TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
2663  {
2664  if (continuationFunction == null)
2665  {
2666  throw new ArgumentNullException("continuationFunction");
2667  }
2668  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2669  return TaskFactory<TResult>.ContinueWhenAllImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
2670  }
2671 
2672  internal static Task<Task> CommonCWAnyLogic(IList<Task> tasks)
2673  {
2674  CompleteOnInvokePromise completeOnInvokePromise = new CompleteOnInvokePromise(tasks);
2675  bool flag = false;
2676  int count = tasks.Count;
2677  for (int i = 0; i < count; i++)
2678  {
2679  Task task = tasks[i];
2680  if (task == null)
2681  {
2682  throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks");
2683  }
2684  if (flag)
2685  {
2686  continue;
2687  }
2688  if (completeOnInvokePromise.IsCompleted)
2689  {
2690  flag = true;
2691  continue;
2692  }
2693  if (task.IsCompleted)
2694  {
2695  completeOnInvokePromise.Invoke(task);
2696  flag = true;
2697  continue;
2698  }
2699  task.AddCompletionAction(completeOnInvokePromise);
2700  if (completeOnInvokePromise.IsCompleted)
2701  {
2702  task.RemoveContinuation(completeOnInvokePromise);
2703  }
2704  }
2705  return completeOnInvokePromise;
2706  }
2707 
2715  [MethodImpl(MethodImplOptions.NoInlining)]
2716  [__DynamicallyInvokable]
2717  public Task ContinueWhenAny(Task[] tasks, Action<Task> continuationAction)
2718  {
2719  if (continuationAction == null)
2720  {
2721  throw new ArgumentNullException("continuationAction");
2722  }
2723  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2724  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2725  }
2726 
2736  [MethodImpl(MethodImplOptions.NoInlining)]
2737  [__DynamicallyInvokable]
2738  public Task ContinueWhenAny(Task[] tasks, Action<Task> continuationAction, CancellationToken cancellationToken)
2739  {
2740  if (continuationAction == null)
2741  {
2742  throw new ArgumentNullException("continuationAction");
2743  }
2744  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2745  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
2746  }
2747 
2757  [MethodImpl(MethodImplOptions.NoInlining)]
2758  [__DynamicallyInvokable]
2759  public Task ContinueWhenAny(Task[] tasks, Action<Task> continuationAction, TaskContinuationOptions continuationOptions)
2760  {
2761  if (continuationAction == null)
2762  {
2763  throw new ArgumentNullException("continuationAction");
2764  }
2765  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2766  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2767  }
2768 
2778  [MethodImpl(MethodImplOptions.NoInlining)]
2779  [__DynamicallyInvokable]
2780  public Task ContinueWhenAny(Task[] tasks, Action<Task> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
2781  {
2782  if (continuationAction == null)
2783  {
2784  throw new ArgumentNullException("continuationAction");
2785  }
2786  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2787  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, continuationOptions, cancellationToken, scheduler, ref stackMark);
2788  }
2789 
2798  [MethodImpl(MethodImplOptions.NoInlining)]
2799  [__DynamicallyInvokable]
2800  public Task<TResult> ContinueWhenAny<TResult>(Task[] tasks, Func<Task, TResult> continuationFunction)
2801  {
2802  if (continuationFunction == null)
2803  {
2804  throw new ArgumentNullException("continuationFunction");
2805  }
2806  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2807  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2808  }
2809 
2819  [MethodImpl(MethodImplOptions.NoInlining)]
2820  [__DynamicallyInvokable]
2821  public Task<TResult> ContinueWhenAny<TResult>(Task[] tasks, Func<Task, TResult> continuationFunction, CancellationToken cancellationToken)
2822  {
2823  if (continuationFunction == null)
2824  {
2825  throw new ArgumentNullException("continuationFunction");
2826  }
2827  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2828  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
2829  }
2830 
2841  [MethodImpl(MethodImplOptions.NoInlining)]
2842  [__DynamicallyInvokable]
2843  public Task<TResult> ContinueWhenAny<TResult>(Task[] tasks, Func<Task, TResult> continuationFunction, TaskContinuationOptions continuationOptions)
2844  {
2845  if (continuationFunction == null)
2846  {
2847  throw new ArgumentNullException("continuationFunction");
2848  }
2849  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2850  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2851  }
2852 
2863  [MethodImpl(MethodImplOptions.NoInlining)]
2864  [__DynamicallyInvokable]
2865  public Task<TResult> ContinueWhenAny<TResult>(Task[] tasks, Func<Task, TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
2866  {
2867  if (continuationFunction == null)
2868  {
2869  throw new ArgumentNullException("continuationFunction");
2870  }
2871  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2872  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
2873  }
2874 
2884  [MethodImpl(MethodImplOptions.NoInlining)]
2885  [__DynamicallyInvokable]
2886  public Task<TResult> ContinueWhenAny<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction)
2887  {
2888  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2889  if (continuationFunction == null)
2890  {
2891  throw new ArgumentNullException("continuationFunction");
2892  }
2893  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2894  }
2895 
2906  [MethodImpl(MethodImplOptions.NoInlining)]
2907  [__DynamicallyInvokable]
2908  public Task<TResult> ContinueWhenAny<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction, CancellationToken cancellationToken)
2909  {
2910  if (continuationFunction == null)
2911  {
2912  throw new ArgumentNullException("continuationFunction");
2913  }
2914  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2915  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
2916  }
2917 
2929  [MethodImpl(MethodImplOptions.NoInlining)]
2930  [__DynamicallyInvokable]
2931  public Task<TResult> ContinueWhenAny<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction, TaskContinuationOptions continuationOptions)
2932  {
2933  if (continuationFunction == null)
2934  {
2935  throw new ArgumentNullException("continuationFunction");
2936  }
2937  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2938  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2939  }
2940 
2952  [MethodImpl(MethodImplOptions.NoInlining)]
2953  [__DynamicallyInvokable]
2954  public Task<TResult> ContinueWhenAny<TAntecedentResult, TResult>(Task<TAntecedentResult>[] tasks, Func<Task<TAntecedentResult>, TResult> continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
2955  {
2956  if (continuationFunction == null)
2957  {
2958  throw new ArgumentNullException("continuationFunction");
2959  }
2960  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2961  return TaskFactory<TResult>.ContinueWhenAnyImpl(tasks, continuationFunction, null, continuationOptions, cancellationToken, scheduler, ref stackMark);
2962  }
2963 
2972  [MethodImpl(MethodImplOptions.NoInlining)]
2973  [__DynamicallyInvokable]
2974  public Task ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>> continuationAction)
2975  {
2976  if (continuationAction == null)
2977  {
2978  throw new ArgumentNullException("continuationAction");
2979  }
2980  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
2981  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, m_defaultContinuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
2982  }
2983 
2993  [MethodImpl(MethodImplOptions.NoInlining)]
2994  [__DynamicallyInvokable]
2995  public Task ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>> continuationAction, CancellationToken cancellationToken)
2996  {
2997  if (continuationAction == null)
2998  {
2999  throw new ArgumentNullException("continuationAction");
3000  }
3001  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
3002  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, m_defaultContinuationOptions, cancellationToken, DefaultScheduler, ref stackMark);
3003  }
3004 
3015  [MethodImpl(MethodImplOptions.NoInlining)]
3016  [__DynamicallyInvokable]
3017  public Task ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>> continuationAction, TaskContinuationOptions continuationOptions)
3018  {
3019  if (continuationAction == null)
3020  {
3021  throw new ArgumentNullException("continuationAction");
3022  }
3023  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
3024  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, continuationOptions, m_defaultCancellationToken, DefaultScheduler, ref stackMark);
3025  }
3026 
3037  [MethodImpl(MethodImplOptions.NoInlining)]
3038  [__DynamicallyInvokable]
3039  public Task ContinueWhenAny<TAntecedentResult>(Task<TAntecedentResult>[] tasks, Action<Task<TAntecedentResult>> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
3040  {
3041  if (continuationAction == null)
3042  {
3043  throw new ArgumentNullException("continuationAction");
3044  }
3045  StackCrawlMark stackMark = StackCrawlMark.LookForMyCaller;
3046  return TaskFactory<VoidTaskResult>.ContinueWhenAnyImpl(tasks, null, continuationAction, continuationOptions, cancellationToken, scheduler, ref stackMark);
3047  }
3048 
3049  internal static Task[] CheckMultiContinuationTasksAndCopy(Task[] tasks)
3050  {
3051  if (tasks == null)
3052  {
3053  throw new ArgumentNullException("tasks");
3054  }
3055  if (tasks.Length == 0)
3056  {
3057  throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks");
3058  }
3059  Task[] array = new Task[tasks.Length];
3060  for (int i = 0; i < tasks.Length; i++)
3061  {
3062  array[i] = tasks[i];
3063  if (array[i] == null)
3064  {
3065  throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks");
3066  }
3067  }
3068  return array;
3069  }
3070 
3071  internal static Task<TResult>[] CheckMultiContinuationTasksAndCopy<TResult>(Task<TResult>[] tasks)
3072  {
3073  if (tasks == null)
3074  {
3075  throw new ArgumentNullException("tasks");
3076  }
3077  if (tasks.Length == 0)
3078  {
3079  throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_EmptyTaskList"), "tasks");
3080  }
3081  Task<TResult>[] array = new Task<TResult>[tasks.Length];
3082  for (int i = 0; i < tasks.Length; i++)
3083  {
3084  array[i] = tasks[i];
3085  if (array[i] == null)
3086  {
3087  throw new ArgumentException(Environment.GetResourceString("Task_MultiTaskContinuation_NullTask"), "tasks");
3088  }
3089  }
3090  return array;
3091  }
3092 
3093  internal static void CheckMultiTaskContinuationOptions(TaskContinuationOptions continuationOptions)
3094  {
3095  if ((continuationOptions & (TaskContinuationOptions.LongRunning | TaskContinuationOptions.ExecuteSynchronously)) == (TaskContinuationOptions.LongRunning | TaskContinuationOptions.ExecuteSynchronously))
3096  {
3097  throw new ArgumentOutOfRangeException("continuationOptions", Environment.GetResourceString("Task_ContinueWith_ESandLR"));
3098  }
3099  if ((continuationOptions & ~(TaskContinuationOptions.PreferFairness | TaskContinuationOptions.LongRunning | TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.DenyChildAttach | TaskContinuationOptions.HideScheduler | TaskContinuationOptions.LazyCancellation | TaskContinuationOptions.NotOnRanToCompletion | TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.NotOnCanceled | TaskContinuationOptions.ExecuteSynchronously)) != 0)
3100  {
3101  throw new ArgumentOutOfRangeException("continuationOptions");
3102  }
3103  if ((continuationOptions & (TaskContinuationOptions.NotOnRanToCompletion | TaskContinuationOptions.NotOnFaulted | TaskContinuationOptions.NotOnCanceled)) != 0)
3104  {
3105  throw new ArgumentOutOfRangeException("continuationOptions", Environment.GetResourceString("Task_MultiTaskContinuation_FireOptions"));
3106  }
3107  }
3108  }
3109 }
Task< TResult > ContinueWhenAll(Task[] tasks, Func< Task[], TResult > continuationFunction, TaskContinuationOptions continuationOptions)
Creates a continuation task that will be started upon the completion of a set of provided Tasks.
Definition: TaskFactory.cs:941
static TaskScheduler?? Current
Gets the T:System.Threading.Tasks.TaskScheduler associated with the currently executing task.
The exception that is thrown when a null reference (Nothing in Visual Basic) is passed to a method th...
Propagates notification that operations should be canceled.
TaskCreationOptions CreationOptions
Gets the T:System.Threading.Tasks.TaskCreationOptions enumeration value for this task factory.
Definition: TaskFactory.cs:128
TaskScheduler Scheduler
Gets the task scheduler for this task factory.
Definition: TaskFactory.cs:116
TaskFactory(TaskCreationOptions creationOptions, TaskContinuationOptions continuationOptions)
Initializes a T:System.Threading.Tasks.TaskFactory`1 instance with the specified configuration.
Definition: TaskFactory.cs:190
Task< TResult > ContinueWhenAny(Task[] tasks, Func< Task, TResult > continuationFunction, CancellationToken cancellationToken)
Creates a continuation task that will be started upon the completion of any task in the provided set.
Task ContinueWhenAny(Task[] tasks, Action< Task > continuationAction, CancellationToken cancellationToken)
Creates a continuation T:System.Threading.Tasks.Task that will be started upon the completion of any ...
Task< TResult > StartNew(Func< TResult > function, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
Creates and starts a task.
Definition: TaskFactory.cs:267
Task ContinueWhenAny(Task[] tasks, Action< Task > continuationAction)
Creates a continuation T:System.Threading.Tasks.Task that will be started upon the completion of any ...
Task< TResult > ContinueWhenAny(Task[] tasks, Func< Task, TResult > continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
Creates a continuation task that will be started upon the completion of any task in the provided set.
Task FromAsync(Func< AsyncCallback, object, IAsyncResult > beginMethod, Action< IAsyncResult > endMethod, object state)
Creates a T:System.Threading.Tasks.Task that represents a pair of begin and end methods that conform ...
TaskFactory(CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
Initializes a T:System.Threading.Tasks.TaskFactory`1 instance with the specified configuration.
Definition: TaskFactory.cs:203
TaskContinuationOptions ContinuationOptions
Gets the T:System.Threading.Tasks.TaskContinuationOptions enumeration value for this task factory.
Definition: TaskFactory.cs:140
Task ContinueWhenAll(Task[] tasks, Action< Task[]> continuationAction, TaskContinuationOptions continuationOptions)
Creates a continuation task that starts when a set of specified tasks has completed.
Represents an object that handles the low-level work of queuing tasks onto threads.
Definition: __Canon.cs:3
TaskContinuationOptions
Specifies the behavior for a task that is created by using the M:System.Threading....
The exception that is thrown when the value of an argument is outside the allowable range of values a...
Task< TResult > StartNew(Func< object, TResult > function, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
Creates and starts a task.
Definition: TaskFactory.cs:331
delegate void AsyncCallback(IAsyncResult ar)
References a method to be called when a corresponding asynchronous operation completes.
Task FromAsync(IAsyncResult asyncResult, Action< IAsyncResult > endMethod)
Creates a T:System.Threading.Tasks.Task that executes an end method action when a specified T:System....
Task< TResult > StartNew(Func< TResult > function, TaskCreationOptions creationOptions)
Creates and starts a task.
Definition: TaskFactory.cs:249
Task StartNew(Action action, TaskCreationOptions creationOptions)
Creates and starts a T:System.Threading.Tasks.Task.
object AsyncState
Gets a user-defined object that qualifies or contains information about an asynchronous operation.
Definition: IAsyncResult.cs:34
Task< TResult > ContinueWhenAll(Task[] tasks, Func< Task[], TResult > continuationFunction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
Creates a continuation task that will be started upon the completion of a set of provided Tasks.
Definition: TaskFactory.cs:965
Task ContinueWhenAny(Task[] tasks, Action< Task > continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
Creates a continuation T:System.Threading.Tasks.Task that will be started upon the completion of any ...
delegate void Action()
Encapsulates a method that has no parameters and does not return a value.
bool IsCancellationRequested
Gets whether cancellation has been requested for this token.
TaskCreationOptions
Specifies flags that control optional behavior for the creation and execution of tasks.
Task StartNew(Action action, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
Creates and starts a T:System.Threading.Tasks.Task.
TaskFactory(TaskScheduler scheduler)
Initializes a T:System.Threading.Tasks.TaskFactory`1 instance with the specified configuration.
Definition: TaskFactory.cs:179
Task< TResult > StartNew(Func< object, TResult > function, object state, TaskCreationOptions creationOptions)
Creates and starts a task.
Definition: TaskFactory.cs:312
Task ContinueWhenAll(Task[] tasks, Action< Task[]> continuationAction)
Creates a continuation task that starts when a set of specified tasks has completed.
static TaskScheduler Default
Gets the default T:System.Threading.Tasks.TaskScheduler instance that is provided by the ....
SecurityAction
Specifies the security actions that can be performed using declarative security.
Provides information about, and means to manipulate, the current environment and platform....
Definition: Environment.cs:21
Represents the status of an asynchronous operation.
Definition: IAsyncResult.cs:9
Task< TResult > FromAsync(IAsyncResult asyncResult, Func< IAsyncResult, TResult > endMethod, TaskCreationOptions creationOptions)
Creates a task that executes an end method function when a specified T:System.IAsyncResult completes.
Definition: TaskFactory.cs:418
Task< TResult > StartNew(Func< TResult > function)
Creates and starts a task.
Definition: TaskFactory.cs:219
TaskFactory(CancellationToken cancellationToken)
Initializes a T:System.Threading.Tasks.TaskFactory`1 instance with the default configuration.
Definition: TaskFactory.cs:171
bool IsCompleted
Gets whether this T:System.Threading.Tasks.Task has completed.
Definition: Task.cs:1370
Task< TResult > ContinueWhenAny(Task[] tasks, Func< Task, TResult > continuationFunction)
Creates a continuation task that will be started upon the completion of any task in the provided set.
CancellationToken CancellationToken
Gets a token associated with the operation that was canceled.
TaskCreationOptions CreationOptions
Gets the T:System.Threading.Tasks.TaskCreationOptions used to create this task.
Definition: Task.cs:1385
Task< TResult > ContinueWhenAny(Task[] tasks, Func< Task, TResult > continuationFunction, TaskContinuationOptions continuationOptions)
Creates a continuation task that will be started upon the completion of any task in the provided set.
Task StartNew(Action action, CancellationToken cancellationToken)
Creates and starts a T:System.Threading.Tasks.Task.
Task FromAsync(IAsyncResult asyncResult, Action< IAsyncResult > endMethod, TaskCreationOptions creationOptions)
Creates a T:System.Threading.Tasks.Task that executes an end method action when a specified T:System....
MethodImplOptions
Defines the details of how a method is implemented.
Task StartNew(Action< object > action, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, TaskScheduler scheduler)
Creates and starts a T:System.Threading.Tasks.Task.
bool CompletedSynchronously
Gets a value that indicates whether the asynchronous operation completed synchronously.
Definition: IAsyncResult.cs:44
Task FromAsync(IAsyncResult asyncResult, Action< IAsyncResult > endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler)
Creates a T:System.Threading.Tasks.Task that executes an end method action when a specified T:System....
static CancellationToken None
Returns an empty T:System.Threading.CancellationToken value.
int Id
Gets an ID for this T:System.Threading.Tasks.Task instance.
Definition: Task.cs:1233
Represents a collection of objects that can be individually accessed by index.
Definition: IList.cs:9
Task FromAsync(Func< AsyncCallback, object, IAsyncResult > beginMethod, Action< IAsyncResult > endMethod, object state, TaskCreationOptions creationOptions)
Creates a T:System.Threading.Tasks.Task that represents a pair of begin and end methods that conform ...
The exception that is thrown when one of the arguments provided to a method is not valid.
An operation that invokes a delegate or lambda expression, such as sampleDelegate....
WaitHandle AsyncWaitHandle
Gets a T:System.Threading.WaitHandle that is used to wait for an asynchronous operation to complete.
Definition: IAsyncResult.cs:25
int Count
Gets the number of elements contained in the T:System.Collections.Generic.ICollection`1.
Definition: ICollection.cs:15
Task StartNew(Action< object > action, object state, TaskCreationOptions creationOptions)
Creates and starts a T:System.Threading.Tasks.Task.
Task< TResult > StartNew(Func< object, TResult > function, object state)
Creates and starts a task.
Definition: TaskFactory.cs:280
The exception that is thrown in a thread upon cancellation of an operation that the thread was execut...
TaskFactory()
Initializes a T:System.Threading.Tasks.TaskFactory`1 instance with the default configuration.
Definition: TaskFactory.cs:163
Represents errors that occur during application execution.To browse the .NET Framework source code fo...
Definition: Exception.cs:22
Task< TResult > FromAsync(IAsyncResult asyncResult, Func< IAsyncResult, TResult > endMethod)
Creates a task that executes an end method function when a specified T:System.IAsyncResult completes.
Definition: TaskFactory.cs:403
Task< TResult > ContinueWhenAll(Task[] tasks, Func< Task[], TResult > continuationFunction)
Creates a continuation task that will be started upon the completion of a set of provided tasks.
Definition: TaskFactory.cs:899
Task StartNew(Action< object > action, object state, CancellationToken cancellationToken)
Creates and starts a T:System.Threading.Tasks.Task.
Task< TResult > StartNew(Func< TResult > function, CancellationToken cancellationToken)
Creates and starts a task.
Definition: TaskFactory.cs:234
Task< TResult > FromAsync(Func< AsyncCallback, object, IAsyncResult > beginMethod, Func< IAsyncResult, TResult > endMethod, object state, TaskCreationOptions creationOptions)
Creates a task that represents a pair of begin and end methods that conform to the Asynchronous Progr...
Definition: TaskFactory.cs:525
Task ContinueWhenAll(Task[] tasks, Action< Task[]> continuationAction, CancellationToken cancellationToken)
Creates a continuation task that starts when a set of specified tasks has completed.
CancellationToken CancellationToken
Gets the default cancellation token for this task factory.
Definition: TaskFactory.cs:104
Task ContinueWhenAll(Task[] tasks, Action< Task[]> continuationAction, CancellationToken cancellationToken, TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
Creates a continuation task that starts when a set of specified tasks has completed.
bool IsCompleted
Gets a value that indicates whether the asynchronous operation has completed.
Definition: IAsyncResult.cs:16
Provides support for creating and scheduling T:System.Threading.Tasks.Task`1 objects.
Definition: TaskFactory.cs:12
Task ContinueWhenAny(Task[] tasks, Action< Task > continuationAction, TaskContinuationOptions continuationOptions)
Creates a continuation T:System.Threading.Tasks.Task that will be started upon the completion of any ...
Task StartNew(Action action)
Creates and starts a task.
Task< TResult > ContinueWhenAll(Task[] tasks, Func< Task[], TResult > continuationFunction, CancellationToken cancellationToken)
Creates a continuation task that will be started upon the completion of a set of provided tasks.
Definition: TaskFactory.cs:920
Task< TResult > FromAsync(IAsyncResult asyncResult, Func< IAsyncResult, TResult > endMethod, TaskCreationOptions creationOptions, TaskScheduler scheduler)
Creates a task that executes an end method function when a specified T:System.IAsyncResult completes.
Definition: TaskFactory.cs:434
Task StartNew(Action< object > action, object state)
Creates and starts a T:System.Threading.Tasks.Task.
Task< TResult > FromAsync(Func< AsyncCallback, object, IAsyncResult > beginMethod, Func< IAsyncResult, TResult > endMethod, object state)
Creates a task that represents a pair of begin and end methods that conform to the Asynchronous Progr...
Definition: TaskFactory.cs:511
Represents an asynchronous operation that can return a value.
Definition: Task.cs:18
Task< TResult > StartNew(Func< object, TResult > function, object state, CancellationToken cancellationToken)
Creates and starts a task.
Definition: TaskFactory.cs:296