TaskActionInvoker.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. //
  2. // TaskActionInvoker.cs
  3. //
  4. // Authors:
  5. // Marek Safar <[email protected]>
  6. //
  7. // Copyright 2011 Xamarin Inc.
  8. //
  9. // Permission is hereby granted, free of charge, to any person obtaining a copy
  10. // of this software and associated documentation files (the "Software"), to deal
  11. // in the Software without restriction, including without limitation the rights
  12. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13. // copies of the Software, and to permit persons to whom the Software is
  14. // furnished to do so, subject to the following conditions:
  15. //
  16. // The above copyright notice and this permission notice shall be included in
  17. // all copies or substantial portions of the Software.
  18. //
  19. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  22. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25. // THE SOFTWARE.
  26. //
  27. //
  28. #if NET_4_0 || MOBILE
  29. namespace System.Threading.Tasks
  30. {
  31. abstract class TaskActionInvoker
  32. {
  33. sealed class ActionInvoke : TaskActionInvoker
  34. {
  35. readonly Action action;
  36. public ActionInvoke (Action action)
  37. {
  38. this.action = action;
  39. }
  40. public override Delegate Action {
  41. get {
  42. return action;
  43. }
  44. }
  45. public override void Invoke (Task owner, object state, Task context)
  46. {
  47. action ();
  48. }
  49. }
  50. sealed class ActionObjectInvoke : TaskActionInvoker
  51. {
  52. readonly Action<object> action;
  53. public ActionObjectInvoke (Action<object> action)
  54. {
  55. this.action = action;
  56. }
  57. public override Delegate Action {
  58. get {
  59. return action;
  60. }
  61. }
  62. public override void Invoke (Task owner, object state, Task context)
  63. {
  64. action (state);
  65. }
  66. }
  67. sealed class ActionTaskInvoke : TaskActionInvoker
  68. {
  69. readonly Action<Task> action;
  70. public ActionTaskInvoke (Action<Task> action)
  71. {
  72. this.action = action;
  73. }
  74. public override Delegate Action {
  75. get {
  76. return action;
  77. }
  78. }
  79. public override void Invoke (Task owner, object state, Task context)
  80. {
  81. action (owner);
  82. }
  83. }
  84. sealed class ActionTasksInvoke : TaskActionInvoker
  85. {
  86. readonly Action<Task[]> action;
  87. readonly Task[] tasks;
  88. public ActionTasksInvoke (Action<Task[]> action, Task[] tasks)
  89. {
  90. this.action = action;
  91. this.tasks = tasks;
  92. }
  93. public override Delegate Action {
  94. get {
  95. return action;
  96. }
  97. }
  98. public override void Invoke (Task owner, object state, Task context)
  99. {
  100. action (tasks);
  101. }
  102. }
  103. sealed class ActionTaskObjectInvoke : TaskActionInvoker
  104. {
  105. readonly Action<Task, object> action;
  106. public ActionTaskObjectInvoke (Action<Task, object> action)
  107. {
  108. this.action = action;
  109. }
  110. public override Delegate Action {
  111. get {
  112. return action;
  113. }
  114. }
  115. public override void Invoke (Task owner, object state, Task context)
  116. {
  117. action (owner, state);
  118. }
  119. }
  120. sealed class ActionTaskObjectInvoke<TResult> : TaskActionInvoker
  121. {
  122. readonly Action<Task<TResult>, object> action;
  123. public ActionTaskObjectInvoke (Action<Task<TResult>, object> action)
  124. {
  125. this.action = action;
  126. }
  127. public override Delegate Action {
  128. get {
  129. return action;
  130. }
  131. }
  132. public override void Invoke (Task owner, object state, Task context)
  133. {
  134. action ((Task<TResult>) owner, state);
  135. }
  136. }
  137. sealed class ActionTaskInvoke<TResult> : TaskActionInvoker
  138. {
  139. readonly Action<Task<TResult>> action;
  140. public ActionTaskInvoke (Action<Task<TResult>> action)
  141. {
  142. this.action = action;
  143. }
  144. public override Delegate Action {
  145. get {
  146. return action;
  147. }
  148. }
  149. public override void Invoke (Task owner, object state, Task context)
  150. {
  151. action ((Task<TResult>) owner);
  152. }
  153. }
  154. sealed class ActionTaskSelected : TaskActionInvoker
  155. {
  156. readonly Action<Task> action;
  157. readonly Task[] tasks;
  158. public ActionTaskSelected (Action<Task> action, Task[] tasks)
  159. {
  160. this.action = action;
  161. this.tasks = tasks;
  162. }
  163. public override Delegate Action {
  164. get {
  165. return action;
  166. }
  167. }
  168. public override void Invoke (Task owner, object state, Task context)
  169. {
  170. var result = ((Task<int>) owner).Result;
  171. action (tasks [result]);
  172. }
  173. }
  174. sealed class FuncInvoke<TResult> : TaskActionInvoker
  175. {
  176. readonly Func<TResult> action;
  177. public FuncInvoke (Func<TResult> action)
  178. {
  179. this.action = action;
  180. }
  181. public override Delegate Action {
  182. get {
  183. return action;
  184. }
  185. }
  186. public override void Invoke (Task owner, object state, Task context)
  187. {
  188. ((Task<TResult>) context).Result = action ();
  189. }
  190. }
  191. sealed class FuncTaskInvoke<TResult> : TaskActionInvoker
  192. {
  193. readonly Func<Task, TResult> action;
  194. public FuncTaskInvoke (Func<Task, TResult> action)
  195. {
  196. this.action = action;
  197. }
  198. public override Delegate Action {
  199. get {
  200. return action;
  201. }
  202. }
  203. public override void Invoke (Task owner, object state, Task context)
  204. {
  205. ((Task<TResult>) context).Result = action (owner);
  206. }
  207. }
  208. sealed class FuncTasksInvoke<TResult> : TaskActionInvoker
  209. {
  210. readonly Func<Task[], TResult> action;
  211. readonly Task[] tasks;
  212. public FuncTasksInvoke (Func<Task[], TResult> action, Task[] tasks)
  213. {
  214. this.action = action;
  215. this.tasks = tasks;
  216. }
  217. public override Delegate Action {
  218. get {
  219. return action;
  220. }
  221. }
  222. public override void Invoke (Task owner, object state, Task context)
  223. {
  224. ((Task<TResult>) context).Result = action (tasks);
  225. }
  226. }
  227. sealed class FuncTaskSelected<TResult> : TaskActionInvoker
  228. {
  229. readonly Func<Task, TResult> action;
  230. readonly Task[] tasks;
  231. public FuncTaskSelected (Func<Task, TResult> action, Task[] tasks)
  232. {
  233. this.action = action;
  234. this.tasks = tasks;
  235. }
  236. public override Delegate Action {
  237. get {
  238. return action;
  239. }
  240. }
  241. public override void Invoke (Task owner, object state, Task context)
  242. {
  243. var result = ((Task<int>) owner).Result;
  244. ((Task<TResult>) context).Result = action (tasks[result]);
  245. }
  246. }
  247. sealed class FuncTaskInvoke<TResult, TNewResult> : TaskActionInvoker
  248. {
  249. readonly Func<Task<TResult>, TNewResult> action;
  250. public FuncTaskInvoke (Func<Task<TResult>, TNewResult> action)
  251. {
  252. this.action = action;
  253. }
  254. public override Delegate Action {
  255. get {
  256. return action;
  257. }
  258. }
  259. public override void Invoke (Task owner, object state, Task context)
  260. {
  261. ((Task<TNewResult>) context).Result = action ((Task<TResult>) owner);
  262. }
  263. }
  264. sealed class FuncObjectInvoke<TResult> : TaskActionInvoker
  265. {
  266. readonly Func<object, TResult> action;
  267. public FuncObjectInvoke (Func<object, TResult> action)
  268. {
  269. this.action = action;
  270. }
  271. public override Delegate Action {
  272. get {
  273. return action;
  274. }
  275. }
  276. public override void Invoke (Task owner, object state, Task context)
  277. {
  278. ((Task<TResult>) context).Result = action (state);
  279. }
  280. }
  281. sealed class FuncTaskObjectInvoke<TResult> : TaskActionInvoker
  282. {
  283. readonly Func<Task, object, TResult> action;
  284. public FuncTaskObjectInvoke (Func<Task, object, TResult> action)
  285. {
  286. this.action = action;
  287. }
  288. public override Delegate Action {
  289. get {
  290. return action;
  291. }
  292. }
  293. public override void Invoke (Task owner, object state, Task context)
  294. {
  295. ((Task<TResult>) context).Result = action (owner, state);
  296. }
  297. }
  298. sealed class FuncTaskObjectInvoke<TResult, TNewResult> : TaskActionInvoker
  299. {
  300. readonly Func<Task<TResult>, object, TNewResult> action;
  301. public FuncTaskObjectInvoke (Func<Task<TResult>, object, TNewResult> action)
  302. {
  303. this.action = action;
  304. }
  305. public override Delegate Action {
  306. get {
  307. return action;
  308. }
  309. }
  310. public override void Invoke (Task owner, object state, Task context)
  311. {
  312. ((Task<TNewResult>) context).Result = action ((Task<TResult>) owner, state);
  313. }
  314. }
  315. public static TaskActionInvoker Create (Action action)
  316. {
  317. return new ActionInvoke (action);
  318. }
  319. public static TaskActionInvoker Create (Action<object> action)
  320. {
  321. return new ActionObjectInvoke (action);
  322. }
  323. public static TaskActionInvoker Create (Action<Task> action)
  324. {
  325. return new ActionTaskInvoke (action);
  326. }
  327. public static TaskActionInvoker Create (Action<Task, object> action)
  328. {
  329. return new ActionTaskObjectInvoke (action);
  330. }
  331. public static TaskActionInvoker Create<TResult> (Action<Task<TResult>> action)
  332. {
  333. return new ActionTaskInvoke<TResult> (action);
  334. }
  335. public static TaskActionInvoker Create<TResult> (Action<Task<TResult>, object> action)
  336. {
  337. return new ActionTaskObjectInvoke<TResult> (action);
  338. }
  339. public static TaskActionInvoker Create<TResult> (Func<TResult> action)
  340. {
  341. return new FuncInvoke<TResult> (action);
  342. }
  343. public static TaskActionInvoker Create<TResult> (Func<object, TResult> action)
  344. {
  345. return new FuncObjectInvoke<TResult> (action);
  346. }
  347. public static TaskActionInvoker Create<TResult> (Func<Task, TResult> action)
  348. {
  349. return new FuncTaskInvoke<TResult> (action);
  350. }
  351. public static TaskActionInvoker Create<TResult> (Func<Task, object, TResult> action)
  352. {
  353. return new FuncTaskObjectInvoke<TResult> (action);
  354. }
  355. public static TaskActionInvoker Create<TResult, TNewResult> (Func<Task<TResult>, TNewResult> action)
  356. {
  357. return new FuncTaskInvoke<TResult, TNewResult> (action);
  358. }
  359. public static TaskActionInvoker Create<TResult, TNewResult> (Func<Task<TResult>, object, TNewResult> action)
  360. {
  361. return new FuncTaskObjectInvoke<TResult, TNewResult> (action);
  362. }
  363. public static TaskActionInvoker Create (Action<Task[]> action, Task[] tasks)
  364. {
  365. return new ActionTasksInvoke (action, tasks);
  366. }
  367. public static TaskActionInvoker Create<TResult> (Func<Task[], TResult> action, Task[] tasks)
  368. {
  369. return new FuncTasksInvoke<TResult> (action, tasks);
  370. }
  371. #region Used by WhenAny
  372. public static TaskActionInvoker Create (Action<Task> action, Task[] tasks)
  373. {
  374. return new ActionTaskSelected (action, tasks);
  375. }
  376. public static TaskActionInvoker Create<TResult> (Func<Task, TResult> action, Task[] tasks)
  377. {
  378. return new FuncTaskSelected<TResult> (action, tasks);
  379. }
  380. #endregion
  381. public abstract Delegate Action { get; }
  382. public abstract void Invoke (Task owner, object state, Task context);
  383. }
  384. }
  385. #endif