.NET 4.x После закрытия приложения процесс не завершается - C#
Формулировка задачи:
Сделал приложение для работы с HID устройствами. Всё что мне необходимо она выполняет, НО когда нажимаю "Подключиться" событие buttonConnect_Click и после этого закрываю приложение в диспетчере задач висит процесс и убивается только вручную через этот самый диспетчер.
Вроде всё по порядку делаю, при закрытии формы использую usb.stopRead(); usb.Disconnect(); а толку ноль.
Как корректно завершить программу?
Листинг программы
- using System;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Windows.Forms;
- using USBHIDDRIVER;
- namespace WindowsFormsApplication_HID
- {
- public partial class Form1 : Form
- {
- //Работа с USB HID
- USBHIDDRIVER.USBInterface usb;
- byte[] currentRecord = null;
- int InBase = 2; //Основание системы счисления для вывода в richTextBox_IN
- int OutBase = 10; //Основание системы счисления для вывода на устройство
- public Form1()
- {
- InitializeComponent();
- }
- private void buttonConnect_Click(object sender, EventArgs e)
- {
- if (usb == null)
- {
- ConnectDevice();
- }
- }
- void ConnectDevice()
- {
- usb = new USBInterface("vid_" + textBox_VID.Text, "pid_" + textBox_PID.Text); //Ищем USB HID устройство
- Thread.Sleep(5);
- if (usb.Connect()) //Если подключились
- {
- usb.enableUsbBufferEvent(new System.EventHandler(usbEventCacher)); //Событие срабатывает если с устройства пришли данные
- usb.startRead(); //Запускаем чтение с устройства
- Thread.Sleep(5);
- labelHIDStatus.Text = "HID устройство успешно подключено";
- labelHIDStatus.ForeColor = System.Drawing.Color.Green;
- }
- else
- {
- labelHIDStatus.Text = "HID устройство не подключено к ПК";
- labelHIDStatus.ForeColor = System.Drawing.Color.Red;
- }
- }
- //Вывод системного времени в статус бар
- public void GetSysTime()
- {
- while(true)
- {
- if (!toolStripStatusTime.IsDisposed)
- {
- toolStripStatusTime.Text = DateTime.Now.ToString("hh:mm:ss:fff"); //Выводим время в статус бар
- Thread.Sleep(100); //Задержка 100 мсек
- }
- }
- }
- //Событие вызывается когда будет принят новый набор данных
- public void usbEventCacher(object sender, System.EventArgs e)
- {
- if (USBHIDDRIVER.USBInterface.usbBuffer.Count > 0)
- {
- int counter = 0;
- while ((byte[])USBHIDDRIVER.USBInterface.usbBuffer[counter] == null)
- {
- //Remove this report from list
- lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
- {
- USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
- }
- }
- //since the remove statement at the end of the loop take the first element
- currentRecord = (byte[])USBHIDDRIVER.USBInterface.usbBuffer[0];
- lock (USBHIDDRIVER.USBInterface.usbBuffer.SyncRoot)
- {
- USBHIDDRIVER.USBInterface.usbBuffer.RemoveAt(0);
- }
- }
- //Вывод получаемых данных от HID устройства в richTextBox_IN
- if (richTextBox_IN.IsHandleCreated && !richTextBox_IN.IsDisposed)
- {
- richTextBox_IN.Invoke((MethodInvoker)(() => richTextBox_IN.AppendText(DateTime.Now.ToString("hh:mm:ss:fff") + "\t" + ArrToString(currentRecord, InBase) + "\r\n")));
- }
- }
- //Преобразование массива byte[] в строку в формате DEC, HEX или BIN
- static string ArrToString(byte[] bytes, int toBase)
- {
- if (bytes == null || bytes.Length == 0) return "";
- StringBuilder sb;
- if (toBase == 2)
- {
- sb = new StringBuilder(bytes.Length * 8 + bytes.Length);
- for (int i = 0; i < bytes.Length; ++i) sb.Append(Convert.ToString(bytes[i], 2).PadLeft(8, '0')).Append(" ");
- }
- else if (toBase == 10)
- {
- sb = new StringBuilder(bytes.Length * 3 + bytes.Length);
- for (int i = 0; i < bytes.Length; ++i) sb.Append(bytes[i].ToString()).Append(" ");
- }
- else if (toBase == 16)
- {
- sb = new StringBuilder(bytes.Length * 2 + bytes.Length);
- for (int i = 0; i < bytes.Length; ++i) sb.Append(bytes[i].ToString("X2")).Append(" ");
- }
- else throw new ArgumentOutOfRangeException("toBase", "toBase must be one of the following: 2, 10, 16.");
- sb.Length -= 5; // Убираем пять лишних пробелов в конце строки
- return sb.ToString();
- }
- //Преобразование строки в формате DEC, HEX или BIN в byte[]
- static byte[] StringToArr(string bytes, int toBase)
- {
- byte[] bytesToOut = null;
- if (bytes == null || bytes.Length == 0) return bytesToOut;
- bytes = System.Text.RegularExpressions.Regex.Replace(bytes, @"\s+", ""); //удаление всех пробелов
- //Перевод из двоичного представления в byte[]
- if (toBase == 2)
- {
- if (bytes.Length % 8 == 0) //Если введено кол-во цифр кратных размеру байта
- {
- byte tmp = 0;
- int j = 0;
- while (bytes.Length > 0) //В цикле переводим строку в массив байтов
- {
- tmp = Convert.ToByte(bytes.Substring(0, 8), 2); //Конвертируем в байт
- Array.Resize(ref bytesToOut, j + 1); //увеличиваем массив на 1
- bytesToOut[j] = tmp; //записиваем байт в массив
- bytes = bytes.Remove(0, 8); //удаляем уже сконвертированные символы из строки
- j++;
- }
- }
- else
- {
- MessageBox.Show("Последний байт не полный.\r\nИсправьте ошибку и попробуйте снова.");
- bytesToOut = null;
- }
- }
- //Перевод из десятичного представления в byte[]
- else if (toBase == 10)
- {
- bytesToOut = bytes.Select(ch => (byte)(ch - '0')).ToArray();
- }
- //Перевод из шестнадцатиричного представления в byte[]
- else if (toBase == 16)
- {
- if (bytes.Length % 2 == 0)
- {
- byte tmp = 0;
- int j = 0;
- while (bytes.Length > 0) //В цикле переводим строку в массив байтов
- {
- tmp = Convert.ToByte(bytes.Substring(0, 2), 16); //Конвертируем в байт
- Array.Resize(ref bytesToOut, j + 1); //увеличиваем массив на 1
- bytesToOut[j] = tmp; //записиваем байт в массив
- bytes = bytes.Remove(0, 2); //удаляем уже сконвертированные символы из строки
- j++;
- }
- }
- else
- {
- MessageBox.Show("Последний байт не полный.\r\nИсправьте ошибку и попробуйте снова.");
- bytesToOut = null;
- }
- }
- else throw new ArgumentOutOfRangeException("toBase", "toBase must be one of the following: 2, 10, 16.");
- return bytesToOut;
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- Thread timeThread = new Thread(new ThreadStart(GetSysTime)); //Создаём поток
- timeThread.IsBackground = true; //Работа в фоне
- timeThread.Priority = ThreadPriority.BelowNormal; //Приоритет ниже среднего
- timeThread.Start(); //Старт потока в котором получаем время
- }
- //Получить список всех подключенных HID устройств
- private void richTextBoxDevices_MouseClick(object sender, MouseEventArgs e)
- {
- USBHIDDRIVER.USBInterface usbI = new USBInterface("0");
- String[] list = usbI.getDeviceList();
- richTextBoxDevices.Clear();
- //проверка пустого list
- if (list != null)
- {
- richTextBoxDevices.Lines = list; //вывести список устройств в richTextBoxDevices
- }
- }
- //Отправка данных на HID устройство
- private void buttonSend_Click(object sender, EventArgs e)
- {
- byte[] bytes = StringToArr (textBox_Out.Text, OutBase); //Преобразование строки в массит байт для отправки в МК
- if (bytes != null) //Если массив байт не пустой
- {
- usb.stopRead();
- usb.write(bytes); //Передать массив байт на HID устройство
- if(pauseToolStripMenuItem.Text == "Пауза")
- {
- usb.startRead();
- }
- }
- }
- private void Form1_FormClosed(object sender, FormClosedEventArgs e)
- {
- if(usb != null)
- {
- usb.stopRead();
- usb.Disconnect();
- }
- }
- private void radioButtonInHex_CheckedChanged(object sender, EventArgs e)
- {
- if (radioButtonInHex.Checked)
- {
- InBase = 16;
- }
- }
- private void radioButtonInDec_CheckedChanged(object sender, EventArgs e)
- {
- if (radioButtonInDec.Checked)
- {
- InBase = 10;
- }
- }
- private void radioButtonInBin_CheckedChanged(object sender, EventArgs e)
- {
- if (radioButtonInBin.Checked)
- {
- InBase = 2;
- }
- }
- private void radioButtonOutDec_CheckedChanged(object sender, EventArgs e)
- {
- if (radioButtonOutDec.Checked)
- {
- OutBase = 10;
- }
- }
- private void radioButtonOutHex_CheckedChanged(object sender, EventArgs e)
- {
- if (radioButtonOutHex.Checked)
- {
- OutBase = 16;
- }
- }
- private void radioButtonOutBin_CheckedChanged(object sender, EventArgs e)
- {
- if (radioButtonOutBin.Checked)
- {
- OutBase = 2;
- }
- }
- private void clearHidListToolStripMenuItem_Click(object sender, EventArgs e)
- {
- richTextBoxDevices.Clear();
- }
- private void InputListToolStripMenuItem_Click(object sender, EventArgs e)
- {
- richTextBox_IN.Clear();
- }
- private void pauseToolStripMenuItem_Click(object sender, EventArgs e)
- {
- if (usb.IsStartRead == false)
- {
- usb.startRead();
- pauseToolStripMenuItem.Text = "Пауза";
- }
- else if (usb.IsStartRead == true)
- {
- usb.stopRead();
- pauseToolStripMenuItem.Text = "Старт";
- }
- }
- }
- }
Решение задачи: «.NET 4.x После закрытия приложения процесс не завершается»
textual
Листинг программы
- public void Disconnect()
- {
- if (this.isConnected)
- {
- this.usbdevice.disconnectDevice();
- this.usbdevice.Dispose(); // <<< после этой строки все системные ресурсы будут корректно освобождены
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д