AsyncResponseManager.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. using System;
  2. using System.Collections;
  3. //using System.Diagnostics;
  4. using System.Threading;
  5. using Wayne.Lib;
  6. #if _SINP
  7. using Wayne.ForecourtControl.Nfs;
  8. #endif
  9. namespace Wayne.ForecourtControl.Fusion
  10. {
  11. #if !(_TEVENTARGS)
  12. class AsyncResponseOperation: IDisposable
  13. {
  14. public int requestId;
  15. public string requestType;
  16. // TODO: get the response Timeout from as a parameter
  17. private int responseTimeout = 60000; // Change to 60 seconds from 30
  18. public EventHandler<AsyncCompletedEventArgs> requestCompleted;
  19. public EventHandler<AsyncCompletedEventArgs<long>> requestCompletedLong;
  20. public EventHandler<AsyncCompletedEventArgs<ITankReadingEx>> requestCompletedITankReading;
  21. public EventHandler<AsyncCompletedEventArgs<PumpAccumulatorReading>> requestCompletedPumpAccumulatorReading;
  22. public long resultLong;
  23. public ITankReadingEx resultITankReading;
  24. public PumpAccumulatorReading resultPumpAccumulatorReading;
  25. public object userToken;
  26. public object src;
  27. public DateTime requestTime;
  28. private System.Threading.Timer responseTimer = null;
  29. public event EventHandler OnResponseTimeout;
  30. public AsyncResponseOperation(int requestId, string requestType, EventHandler<AsyncCompletedEventArgs> requestCompleted, object userToken, object src)
  31. {
  32. this.requestId = requestId;
  33. this.requestType = requestType;
  34. this.requestCompleted = requestCompleted;
  35. this.userToken = userToken;
  36. this.src = src;
  37. requestTime = DateTime.Now;
  38. if (responseTimeout > 0)
  39. responseTimer = new System.Threading.Timer(new System.Threading.TimerCallback(ResponseTimeout), this, responseTimeout, System.Threading.Timeout.Infinite);
  40. }
  41. public AsyncResponseOperation(int requestId, string requestType, EventHandler<AsyncCompletedEventArgs<long>> requestCompleted, object userToken, object src, long resultLong)
  42. {
  43. this.requestId = requestId;
  44. this.requestType = requestType;
  45. this.requestCompletedLong = requestCompleted;
  46. this.resultLong = resultLong;
  47. this.userToken = userToken;
  48. this.src = src;
  49. requestTime = DateTime.Now;
  50. if (responseTimeout > 0)
  51. responseTimer = new System.Threading.Timer(new System.Threading.TimerCallback(ResponseTimeout), this, responseTimeout, System.Threading.Timeout.Infinite);
  52. }
  53. public AsyncResponseOperation(int requestId, string requestType, EventHandler<AsyncCompletedEventArgs<ITankReadingEx>> requestCompleted, object userToken, object src, ITankReadingEx resultITankReading)
  54. {
  55. this.requestId = requestId;
  56. this.requestType = requestType;
  57. this.requestCompletedITankReading = requestCompleted;
  58. this.resultITankReading = resultITankReading;
  59. this.userToken = userToken;
  60. this.src = src;
  61. requestTime = DateTime.Now;
  62. if (responseTimeout > 0)
  63. responseTimer = new System.Threading.Timer(new System.Threading.TimerCallback(ResponseTimeout), this, responseTimeout, System.Threading.Timeout.Infinite);
  64. }
  65. public AsyncResponseOperation(int requestId, string requestType, EventHandler<AsyncCompletedEventArgs<PumpAccumulatorReading>> requestCompleted, object userToken, object src, PumpAccumulatorReading resultPumpAccumulatorReading)
  66. {
  67. this.requestId = requestId;
  68. this.requestType = requestType;
  69. this.requestCompletedPumpAccumulatorReading = requestCompleted;
  70. this.resultPumpAccumulatorReading = resultPumpAccumulatorReading;
  71. this.userToken = userToken;
  72. this.src = src;
  73. requestTime = DateTime.Now;
  74. if (responseTimeout > 0)
  75. responseTimer = new System.Threading.Timer(new System.Threading.TimerCallback(ResponseTimeout), this, responseTimeout, System.Threading.Timeout.Infinite);
  76. }
  77. public void Dispose()
  78. {
  79. if (responseTimer != null)
  80. responseTimer.Dispose();
  81. }
  82. private void ResponseTimeout(Object state)
  83. {
  84. Trace.WriteLine(string.Format("Response Timeout for requestId={0}, requestType={1}", this.requestId, this.requestType));
  85. //FG, MAR-15-2011, bug fix #28041; trigger to GetConfiguration again if there's no pump on FM.
  86. EventArgs<String> ea;
  87. if (this.requestType == "GetConfiguration")
  88. {
  89. ea = new EventArgs<String>("GetConfiguration");
  90. }
  91. else
  92. {
  93. ea = new EventArgs<string>("");
  94. }
  95. if (OnResponseTimeout != null)
  96. OnResponseTimeout.Invoke(this, ea);
  97. }
  98. }
  99. #else
  100. class AsyncResponseOperation<TEventArgs, TResult> : IDisposable where TEventArgs : EventArgs
  101. {
  102. public int requestId;
  103. public string requestType;
  104. // TODO: get the response Timeout from as a parameter
  105. private int responseTimeout = 30000;
  106. public EventHandler<TEventArgs> requestCompleted;
  107. public TResult result;
  108. public object userToken;
  109. public DateTime requestTime;
  110. private System.Threading.Timer responseTimer = null;
  111. public event EventHandler OnResponseTimeout;
  112. public AsyncResponseOperation(int requestId, string requestType, EventHandler<TEventArgs> _requestCompleted, object userToken, object src, TResult result)
  113. {
  114. this.requestId = requestId;
  115. this.requestType = requestType;
  116. this.requestCompleted = _requestCompleted;
  117. this.result = result;
  118. this.userToken = userToken;
  119. this.src = src;
  120. requestTime = DateTime.Now;
  121. if (responseTimeout > 0)
  122. responseTimer = new System.Threading.Timer(new System.Threading.TimerCallback(ResponseTimeout), this, responseTimeout, System.Threading.Timeout.Infinite);
  123. }
  124. public void Dispose()
  125. {
  126. if (responseTimer != null)
  127. responseTimer.Dispose();
  128. }
  129. private void ResponseTimeout(Object state)
  130. {
  131. Trace.WriteLine(string.Format("Response Timeout for requestId={0}, requestType={1}", this.requestId, this.requestType));
  132. if (OnResponseTimeout != null)
  133. OnResponseTimeout.Invoke(this, null);
  134. }
  135. }
  136. #endif
  137. #if !(_TEVENTARGS)
  138. public class AsyncResponseManager
  139. {
  140. public Hashtable AsyncResponseOperationList;
  141. public event EventHandler OnResponseTimeout;
  142. public AsyncResponseManager()
  143. {
  144. AsyncResponseOperationList = new Hashtable();
  145. }
  146. public void OnMessageEnqueuing(object sender, MessageEnqueuedEventArgs e)
  147. {
  148. // add the request to the 'waiting for response request list'
  149. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("init enqueuing message"));
  150. AsyncResponseOperation asyncResponseOperation = null;
  151. try
  152. {
  153. Monitor.Enter(AsyncResponseOperationList);
  154. if (e.ResponseRequired)
  155. {
  156. if (e.RequestCompleted != null)
  157. asyncResponseOperation = new AsyncResponseOperation(e.RequestId, e.RequestType, e.RequestCompleted, e.UserToken, e.Scr);
  158. else if (e.RequestCompletedLong != null)
  159. asyncResponseOperation = new AsyncResponseOperation(e.RequestId, e.RequestType, e.RequestCompletedLong, e.UserToken, e.Scr, e.resultLong);
  160. else if (e.RequestCompletedITankReading != null)
  161. asyncResponseOperation = new AsyncResponseOperation(e.RequestId, e.RequestType, e.RequestCompletedITankReading, e.UserToken, e.Scr, e.resultITankReading);
  162. else if (e.RequestCompletedPumpAccumulatorReading != null)
  163. asyncResponseOperation = new AsyncResponseOperation(e.RequestId, e.RequestType, e.RequestCompletedPumpAccumulatorReading, e.UserToken, e.Scr, e.resultPumpAccumulatorReading);
  164. else
  165. asyncResponseOperation = new AsyncResponseOperation(e.RequestId, e.RequestType, (EventHandler<AsyncCompletedEventArgs>)null, null, null);
  166. asyncResponseOperation.OnResponseTimeout += new EventHandler(asyncResponseOperation_OnResponseTimeout);
  167. AsyncResponseOperationList.Add(e.RequestId, asyncResponseOperation);
  168. }
  169. }
  170. catch (Exception ex)
  171. {
  172. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  173. }
  174. finally
  175. {
  176. Monitor.Exit(AsyncResponseOperationList);
  177. }
  178. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("end enqueuing message"));
  179. }
  180. private void asyncResponseOperation_OnResponseTimeout(object sender, EventArgs e)
  181. {
  182. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("init OnResponseTimeout"));
  183. if (OnResponseTimeout != null)
  184. OnResponseTimeout.Invoke(this, e);
  185. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("end OnResponseTimeout"));
  186. }
  187. public void SendResponse(int requestId, bool result)
  188. {
  189. SendResponse(requestId, result, null);
  190. }
  191. public void SendResponse(int requestId, bool result, Object objresult)
  192. {
  193. AsyncResponseOperation asyncResponseOperation = null;
  194. try
  195. {
  196. Trace.WriteLine(string.Format("init SendResponse requestId={0}", requestId));
  197. Monitor.Enter(AsyncResponseOperationList);
  198. if (AsyncResponseOperationList.ContainsKey(requestId))
  199. {
  200. asyncResponseOperation = (AsyncResponseOperation)(this.AsyncResponseOperationList[requestId]);
  201. this.RemoveRequest(requestId);
  202. }
  203. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse got operation requestId={0}", requestId));
  204. }
  205. catch (Exception ex)
  206. {
  207. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  208. }
  209. finally
  210. {
  211. Monitor.Exit(AsyncResponseOperationList);
  212. }
  213. try
  214. {
  215. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse requestId={0}", requestId));
  216. if (asyncResponseOperation != null)
  217. {
  218. if (asyncResponseOperation.requestCompleted != null)
  219. {
  220. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse requestId={0} requestCompleted != null", requestId));
  221. asyncResponseOperation.requestCompleted.BeginInvoke(asyncResponseOperation.src, new AsyncCompletedEventArgs(result, asyncResponseOperation.userToken), null, null);
  222. }
  223. else if (asyncResponseOperation.requestCompletedLong != null)
  224. {
  225. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse requestId={0} requestCompletedLong != null", requestId));
  226. //asyncResponseOperation.resultLong = (long)objresult;
  227. asyncResponseOperation.requestCompletedLong.BeginInvoke(asyncResponseOperation.src, new AsyncCompletedEventArgs<long>(result, asyncResponseOperation.resultLong, asyncResponseOperation.userToken), null, null);
  228. }
  229. else if (asyncResponseOperation.requestCompletedITankReading != null)
  230. {
  231. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse requestId={0} requestCompletedITankReading != null", requestId));
  232. asyncResponseOperation.resultITankReading = (ITankReadingEx)objresult;
  233. asyncResponseOperation.requestCompletedITankReading.BeginInvoke(asyncResponseOperation.src, new AsyncCompletedEventArgs<ITankReadingEx>(result, asyncResponseOperation.resultITankReading, asyncResponseOperation.userToken), null, null);
  234. }
  235. else if (asyncResponseOperation.requestCompletedPumpAccumulatorReading != null)
  236. {
  237. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse requestId={0} requestCompletedPumpAccumulatorReading != null", requestId));
  238. asyncResponseOperation.resultPumpAccumulatorReading = (PumpAccumulatorReading)objresult;
  239. asyncResponseOperation.requestCompletedPumpAccumulatorReading.BeginInvoke(asyncResponseOperation.src, new AsyncCompletedEventArgs<PumpAccumulatorReading>(result, asyncResponseOperation.resultPumpAccumulatorReading, asyncResponseOperation.userToken), null, null);
  240. }
  241. }
  242. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("end SendResponse requestId={0}", requestId));
  243. }
  244. catch (Exception ex)
  245. {
  246. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  247. }
  248. }
  249. private void RemoveRequest(int requestId)
  250. {
  251. try
  252. {
  253. if (this.AsyncResponseOperationList.ContainsKey(requestId))
  254. {
  255. AsyncResponseOperation asyncResponseOperation = (AsyncResponseOperation)(this.AsyncResponseOperationList[requestId]);
  256. asyncResponseOperation.Dispose();
  257. AsyncResponseOperationList.Remove(requestId);
  258. }
  259. }
  260. catch (Exception ex)
  261. {
  262. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  263. }
  264. }
  265. }
  266. #else
  267. public class AsyncResponseManager<TEventArgs, TResult> where TEventArgs : EventArgs
  268. {
  269. public Hashtable AsyncResponseOperationList;
  270. public event EventHandler OnResponseTimeout;
  271. public AsyncResponseManager()
  272. {
  273. AsyncResponseOperationList = new Hashtable();
  274. }
  275. public void ifsfmessages_OnMessageEnqueuing(object sender, MessageEnqueuedEventArgs<TEventArgs, TResult> e)
  276. {
  277. // add the request to the 'waiting for response request list'
  278. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("init enqueuing message"));
  279. AsyncResponseOperation<TEventArgs, TResult> asyncResponseOperation = null;
  280. try
  281. {
  282. Monitor.Enter(AsyncResponseOperationList);
  283. if (e.ResponseRequired)
  284. {
  285. if (e.RequestCompleted != null)
  286. asyncResponseOperation = new AsyncResponseOperation<TEventArgs, TResult>(e.RequestId, e.RequestType, e.RequestCompleted, e.UserToken, e.result);
  287. else
  288. asyncResponseOperation = new AsyncResponseOperation<TEventArgs, TResult>(e.RequestId, e.RequestType, (EventHandler<TEventArgs>)null, null);
  289. asyncResponseOperation.OnResponseTimeout += new EventHandler(asyncResponseOperation_OnResponseTimeout);
  290. AsyncResponseOperationList.Add(e.RequestId, asyncResponseOperation);
  291. }
  292. }
  293. catch (Exception ex)
  294. {
  295. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  296. }
  297. finally
  298. {
  299. Monitor.Exit(AsyncResponseOperationList);
  300. }
  301. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("end enqueuing message"));
  302. }
  303. private void asyncResponseOperation_OnResponseTimeout(object sender, EventArgs e)
  304. {
  305. Trace.Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("init OnResponseTimeout"));
  306. if (OnResponseTimeout != null)
  307. OnResponseTimeout.Invoke(this, null);
  308. Trace.Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("end OnResponseTimeout"));
  309. }
  310. public void SendResponse(int requestId, bool result)
  311. {
  312. SendResponse(requestId, result, null);
  313. }
  314. public void SendResponse(int requestId, bool result, Object objresult)
  315. {
  316. AsyncResponseOperation<TEventArgs, TResult> asyncResponseOperation = null;
  317. try
  318. {
  319. Trace.WriteLine(string.Format("init SendResponse requestId={0}", requestId));
  320. Monitor.Enter(AsyncResponseOperationList);
  321. if (AsyncResponseOperationList.ContainsKey(requestId))
  322. {
  323. asyncResponseOperation = (AsyncResponseOperation<TEventArgs, TResult>)(this.AsyncResponseOperationList[requestId]);
  324. this.RemoveRequest(requestId);
  325. }
  326. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse got operation requestId={0}", requestId));
  327. }
  328. catch (Exception ex)
  329. {
  330. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  331. }
  332. finally
  333. {
  334. Monitor.Exit(AsyncResponseOperationList);
  335. }
  336. try
  337. {
  338. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("SendResponse requestId={0}", requestId));
  339. if (asyncResponseOperation != null)
  340. {
  341. if (asyncResponseOperation.requestCompleted != null)
  342. asyncResponseOperation.requestCompleted.BeginInvoke(asyncResponseOperation.src, new TEventArgs(result, asyncResponseOperation.userToken), null, null);
  343. asyncResponseOperation.requestCompleted.BeginInvoke(this, new AsyncCompletedEventArgs<TEventArgs, TResult>(result, t, asyncResponseOperation.userToken), null, null);
  344. }
  345. Trace.WriteLineIf(Trace.CheckTraceLevel(3), string.Format("end SendResponse requestId={0}", requestId));
  346. }
  347. catch (Exception ex)
  348. {
  349. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  350. }
  351. }
  352. private void RemoveRequest(int requestId)
  353. {
  354. try
  355. {
  356. if (this.AsyncResponseOperationList.ContainsKey(requestId))
  357. {
  358. AsyncResponseOperation<T> asyncResponseOperation = (AsyncResponseOperation<T>)(this.AsyncResponseOperationList[requestId]);
  359. asyncResponseOperation.Dispose();
  360. AsyncResponseOperationList.Remove(requestId);
  361. }
  362. }
  363. catch (Exception ex)
  364. {
  365. Trace.WriteLine("Exception! " + ex.Message + " - " + ex.StackTrace);
  366. }
  367. }
  368. }
  369. #endif
  370. }