Task_T.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. //
  2. // Task_T.cs
  3. //
  4. // Authors:
  5. // Marek Safar <[email protected]>
  6. //
  7. // Copyright (c) 2008 Jérémie "Garuma" Laval
  8. // Copyright 2011 Xamarin Inc.
  9. //
  10. // Permission is hereby granted, free of charge, to any person obtaining a copy
  11. // of this software and associated documentation files (the "Software"), to deal
  12. // in the Software without restriction, including without limitation the rights
  13. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  14. // copies of the Software, and to permit persons to whom the Software is
  15. // furnished to do so, subject to the following conditions:
  16. //
  17. // The above copyright notice and this permission notice shall be included in
  18. // all copies or substantial portions of the Software.
  19. //
  20. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  23. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  24. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  25. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  26. // THE SOFTWARE.
  27. //
  28. //
  29. #if NET_4_0 || MOBILE
  30. using System.Runtime.CompilerServices;
  31. namespace System.Threading.Tasks
  32. {
  33. [System.Diagnostics.DebuggerDisplay ("Id = {Id}, Status = {Status}, Result = {ResultAsString}")]
  34. [System.Diagnostics.DebuggerTypeProxy (typeof (TaskDebuggerView))]
  35. public class Task<TResult> : Task
  36. {
  37. static readonly TaskFactory<TResult> factory = new TaskFactory<TResult> ();
  38. TResult value;
  39. [System.Diagnostics.DebuggerBrowsable (System.Diagnostics.DebuggerBrowsableState.Never)]
  40. public TResult Result {
  41. get {
  42. if (!IsCompleted)
  43. Wait ();
  44. if (IsCanceled)
  45. throw new AggregateException (new TaskCanceledException (this));
  46. if (Exception != null)
  47. throw Exception;
  48. return value;
  49. }
  50. internal set {
  51. this.value = value;
  52. }
  53. }
  54. string ResultAsString {
  55. get {
  56. if ((Status & (TaskStatus.RanToCompletion)) != 0)
  57. return "" + value;
  58. return "<value not available>";
  59. }
  60. }
  61. public static new TaskFactory<TResult> Factory {
  62. get {
  63. return factory;
  64. }
  65. }
  66. public Task (Func<TResult> function)
  67. : this (function, TaskCreationOptions.None)
  68. {
  69. }
  70. public Task (Func<TResult> function, CancellationToken cancellationToken)
  71. : this (function, cancellationToken, TaskCreationOptions.None)
  72. {
  73. }
  74. public Task (Func<TResult> function, TaskCreationOptions creationOptions)
  75. : this (function, CancellationToken.None, creationOptions)
  76. {
  77. }
  78. public Task (Func<TResult> function, CancellationToken cancellationToken, TaskCreationOptions creationOptions)
  79. : base (TaskActionInvoker.Create (function), null, cancellationToken, creationOptions, null)
  80. {
  81. if (function == null)
  82. throw new ArgumentNullException ("function");
  83. }
  84. public Task (Func<object, TResult> function, object state)
  85. : this (function, state, TaskCreationOptions.None)
  86. {
  87. }
  88. public Task (Func<object, TResult> function, object state, CancellationToken cancellationToken)
  89. : this (function, state, cancellationToken, TaskCreationOptions.None)
  90. {
  91. }
  92. public Task (Func<object, TResult> function, object state, TaskCreationOptions creationOptions)
  93. : this (function, state, CancellationToken.None, creationOptions)
  94. {
  95. }
  96. public Task (Func<object, TResult> function, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions)
  97. : base (TaskActionInvoker.Create (function), state, cancellationToken, creationOptions, null)
  98. {
  99. if (function == null)
  100. throw new ArgumentNullException ("function");
  101. }
  102. internal Task (TaskActionInvoker invoker, object state, CancellationToken cancellationToken, TaskCreationOptions creationOptions, Task parent)
  103. : base (invoker, state, cancellationToken, creationOptions, parent)
  104. {
  105. }
  106. public Task ContinueWith (Action<Task<TResult>> continuationAction)
  107. {
  108. return ContinueWith (continuationAction, TaskContinuationOptions.None);
  109. }
  110. public Task ContinueWith (Action<Task<TResult>> continuationAction, TaskContinuationOptions continuationOptions)
  111. {
  112. return ContinueWith (continuationAction, CancellationToken.None, continuationOptions, TaskScheduler.Current);
  113. }
  114. public Task ContinueWith (Action<Task<TResult>> continuationAction, CancellationToken cancellationToken)
  115. {
  116. return ContinueWith (continuationAction, cancellationToken, TaskContinuationOptions.None, TaskScheduler.Current);
  117. }
  118. public Task ContinueWith (Action<Task<TResult>> continuationAction, TaskScheduler scheduler)
  119. {
  120. return ContinueWith (continuationAction, CancellationToken.None, TaskContinuationOptions.None, scheduler);
  121. }
  122. public Task ContinueWith (Action<Task<TResult>> continuationAction, CancellationToken cancellationToken,
  123. TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
  124. {
  125. if (continuationAction == null)
  126. throw new ArgumentNullException ("continuationAction");
  127. if (scheduler == null)
  128. throw new ArgumentNullException ("scheduler");
  129. Task t = new Task (TaskActionInvoker.Create (continuationAction),
  130. null,
  131. cancellationToken,
  132. GetCreationOptions (continuationOptions),
  133. this);
  134. ContinueWithCore (t, continuationOptions, scheduler);
  135. return t;
  136. }
  137. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, TNewResult> continuationFunction)
  138. {
  139. return ContinueWith<TNewResult> (continuationFunction, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Current);
  140. }
  141. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, TNewResult> continuationFunction, CancellationToken cancellationToken)
  142. {
  143. return ContinueWith<TNewResult> (continuationFunction, cancellationToken, TaskContinuationOptions.None, TaskScheduler.Current);
  144. }
  145. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, TNewResult> continuationFunction, TaskContinuationOptions continuationOptions)
  146. {
  147. return ContinueWith<TNewResult> (continuationFunction, CancellationToken.None, continuationOptions, TaskScheduler.Current);
  148. }
  149. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, TNewResult> continuationFunction, TaskScheduler scheduler)
  150. {
  151. return ContinueWith<TNewResult> (continuationFunction, CancellationToken.None, TaskContinuationOptions.None, scheduler);
  152. }
  153. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, TNewResult> continuationFunction,
  154. CancellationToken cancellationToken,
  155. TaskContinuationOptions continuationOptions,
  156. TaskScheduler scheduler)
  157. {
  158. if (continuationFunction == null)
  159. throw new ArgumentNullException ("continuationFunction");
  160. if (scheduler == null)
  161. throw new ArgumentNullException ("scheduler");
  162. var t = new Task<TNewResult> (TaskActionInvoker.Create (continuationFunction),
  163. null,
  164. cancellationToken,
  165. GetCreationOptions (continuationOptions),
  166. this);
  167. ContinueWithCore (t, continuationOptions, scheduler);
  168. return t;
  169. }
  170. #if NET_4_5
  171. public Task ContinueWith (Action<Task<TResult>, object> continuationAction, object state)
  172. {
  173. return ContinueWith (continuationAction, state, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Current);
  174. }
  175. public Task ContinueWith (Action<Task<TResult>, object> continuationAction, object state, CancellationToken cancellationToken)
  176. {
  177. return ContinueWith (continuationAction, state, cancellationToken, TaskContinuationOptions.None, TaskScheduler.Current);
  178. }
  179. public Task ContinueWith (Action<Task<TResult>, object> continuationAction, object state, TaskContinuationOptions continuationOptions)
  180. {
  181. return ContinueWith (continuationAction, state, CancellationToken.None, continuationOptions, TaskScheduler.Current);
  182. }
  183. public Task ContinueWith (Action<Task<TResult>, object> continuationAction, object state, TaskScheduler scheduler)
  184. {
  185. return ContinueWith (continuationAction, state, CancellationToken.None, TaskContinuationOptions.None, scheduler);
  186. }
  187. public Task ContinueWith (Action<Task<TResult>, object> continuationAction, object state, CancellationToken cancellationToken,
  188. TaskContinuationOptions continuationOptions, TaskScheduler scheduler)
  189. {
  190. if (continuationAction == null)
  191. throw new ArgumentNullException ("continuationAction");
  192. if (scheduler == null)
  193. throw new ArgumentNullException ("scheduler");
  194. var t = new Task (TaskActionInvoker.Create (continuationAction),
  195. state,
  196. cancellationToken,
  197. GetCreationOptions (continuationOptions),
  198. this);
  199. ContinueWithCore (t, continuationOptions, scheduler);
  200. return t;
  201. }
  202. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, object, TNewResult> continuationFunction, object state)
  203. {
  204. return ContinueWith<TNewResult> (continuationFunction, state, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Current);
  205. }
  206. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, object, TNewResult> continuationFunction, object state, CancellationToken cancellationToken)
  207. {
  208. return ContinueWith<TNewResult> (continuationFunction, state, cancellationToken, TaskContinuationOptions.None, TaskScheduler.Current);
  209. }
  210. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, object, TNewResult> continuationFunction, object state, TaskContinuationOptions continuationOptions)
  211. {
  212. return ContinueWith<TNewResult> (continuationFunction, state, CancellationToken.None, continuationOptions, TaskScheduler.Current);
  213. }
  214. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, object, TNewResult> continuationFunction, object state, TaskScheduler scheduler)
  215. {
  216. return ContinueWith<TNewResult> (continuationFunction, state, CancellationToken.None, TaskContinuationOptions.None, scheduler);
  217. }
  218. public Task<TNewResult> ContinueWith<TNewResult> (Func<Task<TResult>, object, TNewResult> continuationFunction, object state,
  219. CancellationToken cancellationToken,
  220. TaskContinuationOptions continuationOptions,
  221. TaskScheduler scheduler)
  222. {
  223. if (continuationFunction == null)
  224. throw new ArgumentNullException ("continuationFunction");
  225. if (scheduler == null)
  226. throw new ArgumentNullException ("scheduler");
  227. var t = new Task<TNewResult> (TaskActionInvoker.Create (continuationFunction),
  228. state,
  229. cancellationToken,
  230. GetCreationOptions (continuationOptions),
  231. this);
  232. ContinueWithCore (t, continuationOptions, scheduler);
  233. return t;
  234. }
  235. public new ConfiguredTaskAwaitable<TResult> ConfigureAwait (bool continueOnCapturedContext)
  236. {
  237. return new ConfiguredTaskAwaitable<TResult> (this, continueOnCapturedContext);
  238. }
  239. public new TaskAwaiter<TResult> GetAwaiter ()
  240. {
  241. return new TaskAwaiter<TResult> (this);
  242. }
  243. #endif
  244. }
  245. }
  246. #endif