IReadCompleteCallback_t.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace IACommService4CSharp
  8. {
  9. public abstract class IReadCompleteCallback_t : IReadCompleteCallback4CSharp
  10. {
  11. private Dictionary<uint, string[]> m_requestCache;
  12. private Mutex m_cacheMutex = new Mutex();
  13. public IReadCompleteCallback_t()
  14. {
  15. m_requestCache = new Dictionary<uint, string[]>();
  16. }
  17. ~IReadCompleteCallback_t()
  18. {
  19. m_requestCache.Clear();
  20. }
  21. //Internal use
  22. public void AddRequestCache(uint transactionId, string[] addressList)
  23. {
  24. m_requestCache[transactionId] = addressList;
  25. }
  26. public void Lock() { m_cacheMutex.WaitOne(); }
  27. public void Unlock() { m_cacheMutex.ReleaseMutex(); }
  28. //Internal use
  29. public override void ReadComplete(uint transactionId, IDataItem4CSharp[] dataItems)
  30. {
  31. var address_list = new List<string>();
  32. if(RetrieveAddressList(transactionId, ref address_list))
  33. {
  34. List<DataItem_t> dataItemList = new List<DataItem_t>();
  35. for (int index = 0; index < dataItems.Length; index++)
  36. {
  37. dataItemList.Add(new DataItem_t(dataItems[index]));
  38. }
  39. ReadComplete(address_list.ToArray(), dataItemList.ToArray());
  40. }
  41. }
  42. private bool RetrieveAddressList(uint transactionId, ref List<string> address_list)
  43. {
  44. Lock();
  45. bool bFind = false;
  46. if (m_requestCache.ContainsKey(transactionId))
  47. {
  48. address_list = m_requestCache[transactionId].ToList();
  49. m_requestCache.Remove(transactionId);
  50. bFind = true;
  51. }
  52. Unlock();
  53. return bFind;
  54. }
  55. public abstract void ReadComplete(string[] addresses, DataItem_t[] dataItems);
  56. }
  57. }