Queue.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. using System;
  2. using System.Collections;
  3. using System.IO;
  4. using System.Runtime.Serialization;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. using System.Text.Json; // Cần thêm namespace này
  7. namespace ApiProcessToken.Models.common
  8. {
  9. public class Queue
  10. {
  11. private int maxQueueSize = 0;
  12. private ArrayList queueData = new ArrayList();
  13. private object mutex;
  14. public Queue()
  15. {
  16. maxQueueSize = 1000000;
  17. mutex = this;
  18. }
  19. public Queue(int maxSize)
  20. {
  21. maxQueueSize = maxSize;
  22. mutex = this;
  23. }
  24. public int Size()
  25. {
  26. lock (mutex)
  27. {
  28. return queueData.Count;
  29. }
  30. }
  31. public bool IsEmpty()
  32. {
  33. lock (mutex)
  34. {
  35. return (queueData.Count == 0);
  36. }
  37. }
  38. public object Dequeue()
  39. {
  40. lock (mutex)
  41. {
  42. object first = null;
  43. if (queueData.Count > 0)
  44. {
  45. first = queueData[0];
  46. queueData.RemoveAt(0);
  47. }
  48. return first;
  49. }
  50. }
  51. public object Dequeue(object obj)
  52. {
  53. object found = null;
  54. lock (mutex)
  55. {
  56. found = queueData.Contains(obj);
  57. if (found != null)
  58. {
  59. queueData.Remove(obj);
  60. }
  61. }
  62. return obj;
  63. }
  64. public void Enqueue(Object obj)
  65. {
  66. lock (mutex)
  67. {
  68. if (queueData.Count >= maxQueueSize)
  69. {
  70. throw new IndexOutOfRangeException("Queue is full. Element not added.");
  71. }
  72. queueData.Add(obj);
  73. }
  74. }
  75. public void Clear()
  76. {
  77. lock (mutex)
  78. {
  79. if (queueData.Count >= 0)
  80. {
  81. queueData.Clear();
  82. }
  83. }
  84. }
  85. public object Find(object obj)
  86. {
  87. lock (mutex)
  88. {
  89. object current;
  90. IEnumerator iter = queueData.GetEnumerator();
  91. while (iter.MoveNext())
  92. {
  93. current = iter.Current;
  94. if (current.Equals(obj))
  95. {
  96. return current;
  97. }
  98. }
  99. }
  100. return null;
  101. }
  102. public ArrayList ToArrayList()
  103. {
  104. return queueData;
  105. }
  106. public ArrayList ToArrayListAndClear()
  107. {
  108. lock (mutex)
  109. {
  110. ArrayList result = new ArrayList();
  111. if (queueData.Count >= 0)
  112. {
  113. result.AddRange(queueData);
  114. queueData.Clear();
  115. }
  116. return result;
  117. }
  118. }
  119. //public void SaveQueue(string file_name)
  120. //{
  121. // if (File.Exists(file_name))
  122. // {
  123. // File.Delete(file_name);
  124. // }
  125. // Stream st = File.Create(file_name);
  126. // BinaryFormatter bf = new BinaryFormatter();
  127. // bf.Serialize(st, queueData);
  128. // st.Close();
  129. //}
  130. //public int LoadQueue(string file_name)
  131. //{
  132. // if (File.Exists(file_name))
  133. // {
  134. // Stream st = File.OpenRead(file_name);
  135. // if (st.Length > 0)
  136. // {
  137. // BinaryFormatter bf = new BinaryFormatter();
  138. // queueData = (ArrayList)bf.Deserialize(st);
  139. // }
  140. // st.Close();
  141. // //File.Delete(file_name);
  142. // }
  143. // return queueData.Count;
  144. //}
  145. public void SaveQueue(string file_name)
  146. {
  147. // 1. Chuyển đổi đối tượng (queueData) thành chuỗi JSON.
  148. // Dùng System.Text.Json.JsonSerializer.Serialize
  149. string jsonString = JsonSerializer.Serialize(queueData);
  150. // 2. Ghi chuỗi JSON đó vào tệp.
  151. // File.WriteAllText tự động tạo tệp nếu nó không tồn tại hoặc ghi đè nếu đã tồn tại.
  152. File.WriteAllText(file_name, jsonString);
  153. }
  154. // Lưu ý: Thay vì gán trực tiếp, chúng ta sẽ trả về đối tượng đã tải.
  155. // Hãy điều chỉnh class chứa hàm này để nó có thể chấp nhận đối tượng trả về.
  156. public static ArrayList LoadQueue(string file_name)
  157. {
  158. if (!File.Exists(file_name))
  159. {
  160. // Trả về một ArrayList rỗng nếu tệp không tồn tại.
  161. return new ArrayList();
  162. }
  163. try
  164. {
  165. // 1. Đọc toàn bộ nội dung tệp thành chuỗi JSON.
  166. string jsonString = File.ReadAllText(file_name);
  167. // 2. Kiểm tra chuỗi JSON có rỗng không (thay cho st.Length > 0).
  168. if (string.IsNullOrWhiteSpace(jsonString))
  169. {
  170. return new ArrayList();
  171. }
  172. // 3. Chuyển đổi chuỗi JSON trở lại thành đối tượng ArrayList.
  173. // Cần truyền rõ ràng kiểu ArrayList
  174. ArrayList loadedData = JsonSerializer.Deserialize<ArrayList>(jsonString);
  175. // Trả về dữ liệu đã tải (hoặc một ArrayList rỗng nếu lỗi deserialize).
  176. return loadedData ?? new ArrayList();
  177. }
  178. catch (Exception ex)
  179. {
  180. // Nên ghi lại lỗi (logging) ở đây để xử lý các vấn đề về định dạng tệp.
  181. Console.WriteLine($"Lỗi khi tải queue từ JSON: {ex.Message}");
  182. return new ArrayList();
  183. }
  184. }
  185. }
  186. }