WorkItemFactory.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. using System;
  2. using System.Threading;
  3. namespace Amib.Threading.Internal
  4. {
  5. #region WorkItemFactory class
  6. public class WorkItemFactory
  7. {
  8. public static WorkItem CreateWorkItem(IWorkItemsGroup workItemsGroup, WIGStartInfo wigStartInfo, WorkItemInfo workItemInfo,
  9. WaitCallback callback, object state)
  10. {
  11. ValidateCallback(callback);
  12. ValidateCallback(workItemInfo.PostExecuteWorkItemCallback);
  13. WorkItem workItem = new WorkItem(
  14. workItemsGroup,
  15. new WorkItemInfo(workItemInfo),
  16. callback,
  17. state);
  18. return workItem;
  19. }
  20. public static WorkItem CreateWorkItem(IWorkItemsGroup workItemsGroup, WIGStartInfo wigStartInfo,
  21. WaitCallback callback, object state)
  22. {
  23. ValidateCallback(callback);
  24. WorkItemInfo workItemInfo = new WorkItemInfo()
  25. {
  26. UseCallerCallContext = wigStartInfo.UseCallerCallContext,
  27. PostExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback,
  28. CallToPostExecute = wigStartInfo.CallToPostExecute,
  29. DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects,
  30. WorkItemPriority = wigStartInfo.WorkItemPriority
  31. };
  32. WorkItem workItem = new WorkItem(
  33. workItemsGroup,
  34. workItemInfo,
  35. callback,
  36. state);
  37. return workItem;
  38. }
  39. /// <summary>
  40. /// Create a new work item
  41. /// </summary>
  42. /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
  43. /// <param name="wigStartInfo">Work item group start information</param>
  44. /// <param name="callback">A callback to execute</param>
  45. /// <returns>Returns a work item</returns>
  46. public static WorkItem CreateWorkItem( IWorkItemsGroup workItemsGroup, WIGStartInfo wigStartInfo, WorkItemCallback callback)
  47. {
  48. return CreateWorkItem(workItemsGroup, wigStartInfo, callback, null);
  49. }
  50. /// <summary>
  51. /// Create a new work item
  52. /// </summary>
  53. /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
  54. /// <param name="wigStartInfo">Work item group start information</param>
  55. /// <param name="callback">A callback to execute</param>
  56. /// <param name="workItemPriority">The priority of the work item</param>
  57. /// <returns>Returns a work item</returns>
  58. public static WorkItem CreateWorkItem( IWorkItemsGroup workItemsGroup, WIGStartInfo wigStartInfo,
  59. WorkItemCallback callback, WorkItemPriority workItemPriority)
  60. {
  61. return CreateWorkItem(workItemsGroup, wigStartInfo, callback, null, workItemPriority);
  62. }
  63. /// <summary>
  64. /// Create a new work item
  65. /// </summary>
  66. /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
  67. /// <param name="wigStartInfo">Work item group start information</param>
  68. /// <param name="workItemInfo">Work item info</param>
  69. /// <param name="callback">A callback to execute</param>
  70. /// <returns>Returns a work item</returns>
  71. public static WorkItem CreateWorkItem( IWorkItemsGroup workItemsGroup, WIGStartInfo wigStartInfo,
  72. WorkItemInfo workItemInfo, WorkItemCallback callback)
  73. {
  74. return CreateWorkItem(
  75. workItemsGroup,
  76. wigStartInfo,
  77. workItemInfo,
  78. callback,
  79. null);
  80. }
  81. /// <summary>
  82. /// Create a new work item
  83. /// </summary>
  84. /// <param name="workItemsGroup">The WorkItemsGroup of this workitem</param>
  85. /// <param name="wigStartInfo">Work item group start information</param>
  86. /// <param name="callback">A callback to execute</param>
  87. /// <param name="state">
  88. /// The context object of the work item. Used for passing arguments to the work item.
  89. /// </param>
  90. /// <returns>Returns a work item</returns>
  91. public static WorkItem CreateWorkItem( IWorkItemsGroup workItemsGroup, WIGStartInfo wigStartInfo,
  92. WorkItemCallback callback, object state)
  93. {
  94. ValidateCallback(callback);
  95. WorkItemInfo workItemInfo = new WorkItemInfo()
  96. {
  97. UseCallerCallContext = wigStartInfo.UseCallerCallContext,
  98. PostExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback,
  99. CallToPostExecute = wigStartInfo.CallToPostExecute,
  100. DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects,
  101. WorkItemPriority = wigStartInfo.WorkItemPriority
  102. };
  103. WorkItem workItem = new WorkItem(
  104. workItemsGroup,
  105. workItemInfo,
  106. callback,
  107. state);
  108. return workItem;
  109. }
  110. /// <summary>
  111. /// Create a new work item
  112. /// </summary>
  113. /// <param name="workItemsGroup">The work items group</param>
  114. /// <param name="wigStartInfo">Work item group start information</param>
  115. /// <param name="callback">A callback to execute</param>
  116. /// <param name="state">
  117. /// The context object of the work item. Used for passing arguments to the work item.
  118. /// </param>
  119. /// <param name="workItemPriority">The work item priority</param>
  120. /// <returns>Returns a work item</returns>
  121. public static WorkItem CreateWorkItem(
  122. IWorkItemsGroup workItemsGroup,
  123. WIGStartInfo wigStartInfo,
  124. WorkItemCallback callback,
  125. object state,
  126. WorkItemPriority workItemPriority)
  127. {
  128. ValidateCallback(callback);
  129. WorkItemInfo workItemInfo = new WorkItemInfo();
  130. workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
  131. workItemInfo.PostExecuteWorkItemCallback = wigStartInfo.PostExecuteWorkItemCallback;
  132. workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute;
  133. workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
  134. workItemInfo.WorkItemPriority = workItemPriority;
  135. WorkItem workItem = new WorkItem(
  136. workItemsGroup,
  137. workItemInfo,
  138. callback,
  139. state);
  140. return workItem;
  141. }
  142. /// <summary>
  143. /// Create a new work item
  144. /// </summary>
  145. /// <param name="workItemsGroup">The work items group</param>
  146. /// <param name="wigStartInfo">Work item group start information</param>
  147. /// <param name="workItemInfo">Work item information</param>
  148. /// <param name="callback">A callback to execute</param>
  149. /// <param name="state">
  150. /// The context object of the work item. Used for passing arguments to the work item.
  151. /// </param>
  152. /// <returns>Returns a work item</returns>
  153. public static WorkItem CreateWorkItem( IWorkItemsGroup workItemsGroup, WIGStartInfo wigStartInfo, WorkItemInfo workItemInfo,
  154. WorkItemCallback callback, object state)
  155. {
  156. ValidateCallback(callback);
  157. ValidateCallback(workItemInfo.PostExecuteWorkItemCallback);
  158. WorkItem workItem = new WorkItem(
  159. workItemsGroup,
  160. new WorkItemInfo(workItemInfo),
  161. callback,
  162. state);
  163. return workItem;
  164. }
  165. /// <summary>
  166. /// Create a new work item
  167. /// </summary>
  168. /// <param name="workItemsGroup">The work items group</param>
  169. /// <param name="wigStartInfo">Work item group start information</param>
  170. /// <param name="callback">A callback to execute</param>
  171. /// <param name="state">
  172. /// The context object of the work item. Used for passing arguments to the work item.
  173. /// </param>
  174. /// <param name="postExecuteWorkItemCallback">
  175. /// A delegate to call after the callback completion
  176. /// </param>
  177. /// <returns>Returns a work item</returns>
  178. public static WorkItem CreateWorkItem(
  179. IWorkItemsGroup workItemsGroup,
  180. WIGStartInfo wigStartInfo,
  181. WorkItemCallback callback,
  182. object state,
  183. PostExecuteWorkItemCallback postExecuteWorkItemCallback)
  184. {
  185. ValidateCallback(callback);
  186. ValidateCallback(postExecuteWorkItemCallback);
  187. WorkItemInfo workItemInfo = new WorkItemInfo();
  188. workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
  189. workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
  190. workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute;
  191. workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
  192. workItemInfo.WorkItemPriority = wigStartInfo.WorkItemPriority;
  193. WorkItem workItem = new WorkItem(
  194. workItemsGroup,
  195. workItemInfo,
  196. callback,
  197. state);
  198. return workItem;
  199. }
  200. /// <summary>
  201. /// Create a new work item
  202. /// </summary>
  203. /// <param name="workItemsGroup">The work items group</param>
  204. /// <param name="wigStartInfo">Work item group start information</param>
  205. /// <param name="callback">A callback to execute</param>
  206. /// <param name="state">
  207. /// The context object of the work item. Used for passing arguments to the work item.
  208. /// </param>
  209. /// <param name="postExecuteWorkItemCallback">
  210. /// A delegate to call after the callback completion
  211. /// </param>
  212. /// <param name="workItemPriority">The work item priority</param>
  213. /// <returns>Returns a work item</returns>
  214. public static WorkItem CreateWorkItem(
  215. IWorkItemsGroup workItemsGroup,
  216. WIGStartInfo wigStartInfo,
  217. WorkItemCallback callback,
  218. object state,
  219. PostExecuteWorkItemCallback postExecuteWorkItemCallback,
  220. WorkItemPriority workItemPriority)
  221. {
  222. ValidateCallback(callback);
  223. ValidateCallback(postExecuteWorkItemCallback);
  224. WorkItemInfo workItemInfo = new WorkItemInfo();
  225. workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
  226. workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
  227. workItemInfo.CallToPostExecute = wigStartInfo.CallToPostExecute;
  228. workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
  229. workItemInfo.WorkItemPriority = workItemPriority;
  230. WorkItem workItem = new WorkItem(
  231. workItemsGroup,
  232. workItemInfo,
  233. callback,
  234. state);
  235. return workItem;
  236. }
  237. /// <summary>
  238. /// Create a new work item
  239. /// </summary>
  240. /// <param name="workItemsGroup">The work items group</param>
  241. /// <param name="wigStartInfo">Work item group start information</param>
  242. /// <param name="callback">A callback to execute</param>
  243. /// <param name="state">
  244. /// The context object of the work item. Used for passing arguments to the work item.
  245. /// </param>
  246. /// <param name="postExecuteWorkItemCallback">
  247. /// A delegate to call after the callback completion
  248. /// </param>
  249. /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
  250. /// <returns>Returns a work item</returns>
  251. public static WorkItem CreateWorkItem(
  252. IWorkItemsGroup workItemsGroup,
  253. WIGStartInfo wigStartInfo,
  254. WorkItemCallback callback,
  255. object state,
  256. PostExecuteWorkItemCallback postExecuteWorkItemCallback,
  257. CallToPostExecute callToPostExecute)
  258. {
  259. ValidateCallback(callback);
  260. ValidateCallback(postExecuteWorkItemCallback);
  261. WorkItemInfo workItemInfo = new WorkItemInfo();
  262. workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
  263. workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
  264. workItemInfo.CallToPostExecute = callToPostExecute;
  265. workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
  266. workItemInfo.WorkItemPriority = wigStartInfo.WorkItemPriority;
  267. WorkItem workItem = new WorkItem(
  268. workItemsGroup,
  269. workItemInfo,
  270. callback,
  271. state);
  272. return workItem;
  273. }
  274. /// <summary>
  275. /// Create a new work item
  276. /// </summary>
  277. /// <param name="workItemsGroup">The work items group</param>
  278. /// <param name="wigStartInfo">Work item group start information</param>
  279. /// <param name="callback">A callback to execute</param>
  280. /// <param name="state">
  281. /// The context object of the work item. Used for passing arguments to the work item.
  282. /// </param>
  283. /// <param name="postExecuteWorkItemCallback">
  284. /// A delegate to call after the callback completion
  285. /// </param>
  286. /// <param name="callToPostExecute">Indicates on which cases to call to the post execute callback</param>
  287. /// <param name="workItemPriority">The work item priority</param>
  288. /// <returns>Returns a work item</returns>
  289. public static WorkItem CreateWorkItem(
  290. IWorkItemsGroup workItemsGroup,
  291. WIGStartInfo wigStartInfo,
  292. WorkItemCallback callback,
  293. object state,
  294. PostExecuteWorkItemCallback postExecuteWorkItemCallback,
  295. CallToPostExecute callToPostExecute,
  296. WorkItemPriority workItemPriority)
  297. {
  298. ValidateCallback(callback);
  299. ValidateCallback(postExecuteWorkItemCallback);
  300. WorkItemInfo workItemInfo = new WorkItemInfo();
  301. workItemInfo.UseCallerCallContext = wigStartInfo.UseCallerCallContext;
  302. workItemInfo.PostExecuteWorkItemCallback = postExecuteWorkItemCallback;
  303. workItemInfo.CallToPostExecute = callToPostExecute;
  304. workItemInfo.WorkItemPriority = workItemPriority;
  305. workItemInfo.DisposeOfStateObjects = wigStartInfo.DisposeOfStateObjects;
  306. WorkItem workItem = new WorkItem(
  307. workItemsGroup,
  308. workItemInfo,
  309. callback,
  310. state);
  311. return workItem;
  312. }
  313. private static void ValidateCallback(Delegate callback)
  314. {
  315. if (callback != null && callback.GetInvocationList().Length > 1)
  316. {
  317. throw new NotSupportedException("SmartThreadPool doesn't support delegates chains");
  318. }
  319. }
  320. }
  321. #endregion
  322. }