01.mandar Ответов: 3

Закройте последовательный COM порт безопасно в C#


main()
{

thread_B.start();
thread_A.start();

}


public void Thread_A()
{
    while(true)
        if (State == 1)
        {
            try
            {
                Thread_B.Interrupt();
                if (!thr.Join(5000))
                {
                    Thread_B.Abort();
                    GC.Collect();
                    Thread_B.ExecutionContext.Dispose();
                    //    State = 0;
                    // From here i want to end thread safely    
                    // Application must not restart
                   
                }
                Console.WriteLine("\nInsert_Dongle");
            }
            catch (Exception e)
            { }
        }
}


Thread Thread_B= new Thread(delegate()
{
    State = TLoop();
});

public static int TLoop()
{

while(true)
// some error found
return 1;//


}



я открываю последовательный порт в потоке _B
если кто то удаляет последовательный кабель во время выполнения кода входящие данные останавливаются но последовательный порт все еще открыт если я пытаюсь закрыть последовательный порт он дает

- необработанная система исключений.ObjectDisposedException произошло в mscorlib.dll дополнительная информация : безопасная ручка была закрыта"


как закрыть компорт?

Sergey Alexandrovich Kryukov

Крайне плохая резьба, бессмысленное использование GC, но хороший вопрос.
--СА

3 Ответов

Рейтинг:
2

labshasanbd

<конфигурация>
<время выполнения>
<legacyUnhandledExceptionPolicy enabled="1"/>
</runtime>
</конфигурация>

Я пробовал это сделать, и это помогло мне не тратить на это больше времени...
По крайней мере, сейчас не происходит сбоя приложения...
Благодаря Джастину Вигнал(http://stackoverflow.com/questions/3230311/problem-with-serialport[^]) и Ганс Пассант (http://stackoverflow.com/questions/3230311/problem-with-serialport[^])


Рейтинг:
19

01.mandar

http://connect.microsoft.com/VisualStudio/feedback/details/140018/serialport-crashes-after-disconnect-of-usb-com-port[^]
частично разрешил сверху ссылку.
я все еще получаю исключение ввода-вывода для портов , но приложение не падает (по крайней мере, на данный момент) :)


Рейтинг:
1

OriginalGriff

Не прерывайте нить.
Вместо этого используйте тайм-аут на SerialPort (Последовательный порт.Свойство ReadTimeout [^] что приведет к тому, что операция чтения вызовет исключение таймаута). Используйте семафор, чтобы сообщить потоку о завершении, когда это возможно, и позволить ему закрыться упорядоченным образом.


01.mandar

на ReadTimeout я жду некоторое время и перепроверяю любые данные по порту на Bluetooth.
проблема возникает, когда код запущен и последовательный ключ Bluetooth удален
происходит событие "устройство не распознает команду"
поэтому мне нужно закрыть поток, который считывает данные по последовательному порту, и перезапустить поток через некоторое время.