.NET 4.x После закрытия приложения процесс не завершается - C#

Узнай цену своей работы

Формулировка задачи:

Сделал приложение для работы с HID устройствами. Всё что мне необходимо она выполняет, НО когда нажимаю "Подключиться" событие buttonConnect_Click и после этого закрываю приложение в диспетчере задач висит процесс и убивается только вручную через этот самый диспетчер. Вроде всё по порядку делаю, при закрытии формы использую usb.stopRead(); usb.Disconnect(); а толку ноль. Как корректно завершить программу?
Листинг программы
  1. using System;
  2. using System.Linq;
  3. using System.Text;
  4. using System.Threading;
  5. using System.Windows.Forms;
  6. using USBHIDDRIVER;
  7. namespace WindowsFormsApplication_HID
  8. {
  9. public partial class Form1 : Form
  10. {
  11. //Работа с USB HID
  12. USBHIDDRIVER.USBInterface usb;
  13. byte[] currentRecord = null;
  14. int InBase = 2; //Основание системы счисления для вывода в richTextBox_IN
  15. int OutBase = 10; //Основание системы счисления для вывода на устройство
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20. private void buttonConnect_Click(object sender, EventArgs e)
  21. {
  22. if (usb == null)
  23. {
  24. ConnectDevice();
  25. }
  26. }
  27. void ConnectDevice()
  28. {
  29. usb = new USBInterface("vid_" + textBox_VID.Text, "pid_" + textBox_PID.Text); //Ищем USB HID устройство
  30. Thread.Sleep(5);
  31. if (usb.Connect()) //Если подключились
  32. {
  33. usb.enableUsbBufferEvent(new System.EventHandler(usbEventCacher)); //Событие срабатывает если с устройства пришли данные
  34. usb.startRead(); //Запускаем чтение с устройства
  35. Thread.Sleep(5);
  36. labelHIDStatus.Text = "HID устройство успешно подключено";
  37. labelHIDStatus.ForeColor = System.Drawing.Color.Green;
  38. }
  39. else
  40. {
  41. labelHIDStatus.Text = "HID устройство не подключено к ПК";
  42. labelHIDStatus.ForeColor = System.Drawing.Color.Red;
  43. }
  44. }
  45. //Вывод системного времени в статус бар
  46. public void GetSysTime()
  47. {
  48. while(true)
  49. {
  50. if (!toolStripStatusTime.IsDisposed)
  51. {
  52. toolStripStatusTime.Text = DateTime.Now.ToString("hh:mm:ss:fff"); //Выводим время в статус бар
  53. Thread.Sleep(100); //Задержка 100 мсек
  54. }
  55. }
  56. }
  57. //Событие вызывается когда будет принят новый набор данных
  58. public void usbEventCacher(object sender, System.EventArgs e)
  59. {
  60. if (USBHIDDRIVER.USBInterface.usbBuffer.Count > 0)
  61. {
  62. int counter = 0;
  63. while ((byte[])USBHIDDRIVER.USBInterface.usbBuffer[counter] == null)
  64. {
  65. //Remove this report from list
  66. lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
  67. {
  68. USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
  69. }
  70. }
  71. //since the remove statement at the end of the loop take the first element
  72. currentRecord = (byte[])USBHIDDRIVER.USBInterface.usbBuffer[0];
  73. lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
  74. {
  75. USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
  76. }
  77. }
  78. //Вывод получаемых данных от HID устройства в richTextBox_IN
  79. if (richTextBox_IN.IsHandleCreated && !richTextBox_IN.IsDisposed)
  80. {
  81. richTextBox_IN.Invoke((MethodInvoker)(() => richTextBox_IN.AppendText(DateTime.Now.ToString("hh:mm:ss:fff") + "\t" + ArrToString(currentRecord, InBase) + "\r\n")));
  82. }
  83. }
  84. //Преобразование массива byte[] в строку в формате DEC, HEX или BIN
  85. static string ArrToString(byte[] bytes, int toBase)
  86. {
  87. if (bytes == null || bytes.Length == 0) return "";
  88. StringBuilder sb;
  89. if (toBase == 2)
  90. {
  91. sb = new StringBuilder(bytes.Length * 8 + bytes.Length);
  92. for (int i = 0; i < bytes.Length; ++i) sb.Append(Convert.ToString(bytes[i], 2).PadLeft(8, '0')).Append(" ");
  93. }
  94. else if (toBase == 10)
  95. {
  96. sb = new StringBuilder(bytes.Length * 3 + bytes.Length);
  97. for (int i = 0; i < bytes.Length; ++i) sb.Append(bytes[i].ToString()).Append(" ");
  98. }
  99. else if (toBase == 16)
  100. {
  101. sb = new StringBuilder(bytes.Length * 2 + bytes.Length);
  102. for (int i = 0; i < bytes.Length; ++i) sb.Append(bytes[i].ToString("X2")).Append(" ");
  103. }
  104. else throw new ArgumentOutOfRangeException("toBase", "toBase must be one of the following: 2, 10, 16.");
  105. sb.Length -= 5; // Убираем пять лишних пробелов в конце строки
  106. return sb.ToString();
  107. }
  108. //Преобразование строки в формате DEC, HEX или BIN в byte[]
  109. static byte[] StringToArr(string bytes, int toBase)
  110. {
  111. byte[] bytesToOut = null;
  112. if (bytes == null || bytes.Length == 0) return bytesToOut;
  113. bytes = System.Text.RegularExpressions.Regex.Replace(bytes, @"\s+", ""); //удаление всех пробелов
  114. //Перевод из двоичного представления в byte[]
  115. if (toBase == 2)
  116. {
  117. if (bytes.Length % 8 == 0) //Если введено кол-во цифр кратных размеру байта
  118. {
  119. byte tmp = 0;
  120. int j = 0;
  121. while (bytes.Length > 0) //В цикле переводим строку в массив байтов
  122. {
  123. tmp = Convert.ToByte(bytes.Substring(0, 8), 2); //Конвертируем в байт
  124. Array.Resize(ref bytesToOut, j + 1); //увеличиваем массив на 1
  125. bytesToOut[j] = tmp; //записиваем байт в массив
  126. bytes = bytes.Remove(0, 8); //удаляем уже сконвертированные символы из строки
  127. j++;
  128. }
  129. }
  130. else
  131. {
  132. MessageBox.Show("Последний байт не полный.\r\nИсправьте ошибку и попробуйте снова.");
  133. bytesToOut = null;
  134. }
  135. }
  136. //Перевод из десятичного представления в byte[]
  137. else if (toBase == 10)
  138. {
  139. bytesToOut = bytes.Select(ch => (byte)(ch - '0')).ToArray();
  140. }
  141. //Перевод из шестнадцатиричного представления в byte[]
  142. else if (toBase == 16)
  143. {
  144. if (bytes.Length % 2 == 0)
  145. {
  146. byte tmp = 0;
  147. int j = 0;
  148. while (bytes.Length > 0) //В цикле переводим строку в массив байтов
  149. {
  150. tmp = Convert.ToByte(bytes.Substring(0, 2), 16); //Конвертируем в байт
  151. Array.Resize(ref bytesToOut, j + 1); //увеличиваем массив на 1
  152. bytesToOut[j] = tmp; //записиваем байт в массив
  153. bytes = bytes.Remove(0, 2); //удаляем уже сконвертированные символы из строки
  154. j++;
  155. }
  156. }
  157. else
  158. {
  159. MessageBox.Show("Последний байт не полный.\r\nИсправьте ошибку и попробуйте снова.");
  160. bytesToOut = null;
  161. }
  162. }
  163. else throw new ArgumentOutOfRangeException("toBase", "toBase must be one of the following: 2, 10, 16.");
  164. return bytesToOut;
  165. }
  166. private void Form1_Load(object sender, EventArgs e)
  167. {
  168. Thread timeThread = new Thread(new ThreadStart(GetSysTime)); //Создаём поток
  169. timeThread.IsBackground = true; //Работа в фоне
  170. timeThread.Priority = ThreadPriority.BelowNormal; //Приоритет ниже среднего
  171. timeThread.Start(); //Старт потока в котором получаем время
  172. }
  173. //Получить список всех подключенных HID устройств
  174. private void richTextBoxDevices_MouseClick(object sender, MouseEventArgs e)
  175. {
  176. USBHIDDRIVER.USBInterface usbI = new USBInterface("0");
  177. String[] list = usbI.getDeviceList();
  178. richTextBoxDevices.Clear();
  179. //проверка пустого list
  180. if (list != null)
  181. {
  182. richTextBoxDevices.Lines = list; //вывести список устройств в richTextBoxDevices
  183. }
  184. }
  185. //Отправка данных на HID устройство
  186. private void buttonSend_Click(object sender, EventArgs e)
  187. {
  188. byte[] bytes = StringToArr (textBox_Out.Text, OutBase); //Преобразование строки в массит байт для отправки в МК
  189. if (bytes != null) //Если массив байт не пустой
  190. {
  191. usb.stopRead();
  192. usb.write(bytes); //Передать массив байт на HID устройство
  193. if(pauseToolStripMenuItem.Text == "Пауза")
  194. {
  195. usb.startRead();
  196. }
  197. }
  198. }
  199. private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  200. {
  201. if(usb != null)
  202. {
  203. usb.stopRead();
  204. usb.Disconnect();
  205. }
  206. }
  207. private void radioButtonInHex_CheckedChanged(object sender, EventArgs e)
  208. {
  209. if (radioButtonInHex.Checked)
  210. {
  211. InBase = 16;
  212. }
  213. }
  214. private void radioButtonInDec_CheckedChanged(object sender, EventArgs e)
  215. {
  216. if (radioButtonInDec.Checked)
  217. {
  218. InBase = 10;
  219. }
  220. }
  221. private void radioButtonInBin_CheckedChanged(object sender, EventArgs e)
  222. {
  223. if (radioButtonInBin.Checked)
  224. {
  225. InBase = 2;
  226. }
  227. }
  228. private void radioButtonOutDec_CheckedChanged(object sender, EventArgs e)
  229. {
  230. if (radioButtonOutDec.Checked)
  231. {
  232. OutBase = 10;
  233. }
  234. }
  235. private void radioButtonOutHex_CheckedChanged(object sender, EventArgs e)
  236. {
  237. if (radioButtonOutHex.Checked)
  238. {
  239. OutBase = 16;
  240. }
  241. }
  242. private void radioButtonOutBin_CheckedChanged(object sender, EventArgs e)
  243. {
  244. if (radioButtonOutBin.Checked)
  245. {
  246. OutBase = 2;
  247. }
  248. }
  249. private void clearHidListToolStripMenuItem_Click(object sender, EventArgs e)
  250. {
  251. richTextBoxDevices.Clear();
  252. }
  253. private void InputListToolStripMenuItem_Click(object sender, EventArgs e)
  254. {
  255. richTextBox_IN.Clear();
  256. }
  257. private void pauseToolStripMenuItem_Click(object sender, EventArgs e)
  258. {
  259. if (usb.IsStartRead == false)
  260. {
  261. usb.startRead();
  262. pauseToolStripMenuItem.Text = "Пауза";
  263. }
  264. else if (usb.IsStartRead == true)
  265. {
  266. usb.stopRead();
  267. pauseToolStripMenuItem.Text = "Старт";
  268. }
  269. }
  270. }
  271. }

Решение задачи: «.NET 4.x После закрытия приложения процесс не завершается»

textual
Листинг программы
  1. public void Disconnect()
  2. {
  3.     if (this.isConnected)
  4.     {
  5.         this.usbdevice.disconnectDevice();
  6.         this.usbdevice.Dispose();  // <<< после этой строки все системные ресурсы будут корректно освобождены
  7.     }
  8. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы