IWriteCompleteCallback_t.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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 IWriteCompleteCallback_t : IWriteCompleteCallback4CSharp
  10. {
  11. private Dictionary<uint, string[]> m_requestCache;
  12. private Mutex m_cacheMutex = new Mutex();
  13. public IWriteCompleteCallback_t()
  14. {
  15. m_requestCache = new Dictionary<uint, string[]>();
  16. }
  17. ~IWriteCompleteCallback_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 WriteComplete(uint transactionId, uint[] results)
  30. {
  31. var address_list = new List<string>();
  32. if (RetrieveAddressList(transactionId, ref address_list))
  33. {
  34. WriteComplete(address_list.ToArray(), results);
  35. }
  36. }
  37. private bool RetrieveAddressList(uint transactionId, ref List<string> address_list)
  38. {
  39. Lock();
  40. bool bFind = false;
  41. if (m_requestCache.ContainsKey(transactionId))
  42. {
  43. address_list = m_requestCache[transactionId].ToList();
  44. m_requestCache.Remove(transactionId);
  45. bFind = true;
  46. }
  47. Unlock();
  48. return bFind;
  49. }
  50. public abstract void WriteComplete(string[] addresses, uint[] results);
  51. }
  52. }