Прерывание многопоточности

79
05 сентября 2019, 20:00

пишу программу, работающую с несколькими модемами. Для ускорения работы использую async await методы и запускаю их асинхронно. Открытие порта проходит нормально. Далее инициализирую модем

    int ModemConnect(string modemNum)
    {
        Thread.Sleep(1000);
        _port.Write("+++\r\n");
        _port.Write("ATE1\r\n");
        Thread.Sleep(500);
        _port.Write("ATH0\r\n"); // установка режима ожидания 
        Thread.Sleep(500);
        _port.Write("AT+IFC=0,2\r\n"); // устанавливается режим контроля над передачей
        Thread.Sleep(500);
        _port.Write("at+cbst=7,0,1\r\n"); // устанавливается прозрачный режим 
        Thread.Sleep(500);
        if (!Regex.IsMatch(modemNum, @"(8|\+)9[0-9]{9}"))
            return 11;
        _port.Write("ATDT " + modemNum + "\r\n" + " ");
        return 0;
    }

Дело доходит до набора номера, соответствующая AT команда на модем уходит. Дальше приложение вываливается с ошибкой

"Дескриптор SafeHandle был закрыт".

Тут я не знаю, в чем дело.. Может быть из-за того, что установление связи с модемом - длительная операция (до 1 минуты). Но как в этом убедиться и что делать дальше?

Answer 1
private async Task<int> ModemConnect(string modemNum)
    {
        //проверку входных параметров
        //нужно делать в самомом начале метода
        //а не в середине работы,
        //когда вы начали дергать модем
        //и вставать в ожидание
        if (!Regex.IsMatch(modemNum, @"(8|\+)9[0-9]{9}"))
            return 11;
        //Thread.Sleep() - блокирует поток,
        //CPU совсем "не обращает на него внимание".
        //Thread.Sleep(1000);
        //Если вы хотите "подождать" в методе, который
        //выполняет input/output то надо использовать Task.Delay()
        await Task.Delay(1000);
        _port.Write("+++\r\n");
        _port.Write("ATE1\r\n");
        await Task.Delay(500);
        _port.Write("ATH0\r\n"); // установка режима ожидания
        await Task.Delay(500);
        _port.Write("AT+IFC=0,2\r\n"); // устанавливается режим контроля над передачей
        await Task.Delay(500);
        _port.Write("at+cbst=7,0,1\r\n"); // устанавливается прозрачный режим
        await Task.Delay(500);
        _port.Write("ATDT " + modemNum + "\r\n" + " ");
        //возвращать int в качестве
        //ответа на невычисляемые задачи,
        //а с целью отражения успеха/неуспеха/ошибки
        //фиговая практика (вы не на С пишите в конце концов).
        //для этого нужно использовать enum или спец.класс,
        //на худой конец константное строковое значение
        return 0;
    }

Вызывать такой метод надо так

int result = await ModemConnect("1234567");
READ ALSO
Прочесть журнал безопасности Windows без прав администратора

Прочесть журнал безопасности Windows без прав администратора

Пишу приложение для того чтобы выводить журналы Windows в нужном мне видеРади пробы написал консольную прогу, которая просто извлекает все записи...

96
Ввод логина и пароля C# + Selenium

Ввод логина и пароля C# + Selenium

Есть ресурс - https://adminqapnmsoftlabs

93
ASP.NET Identity (Vue.Js)

ASP.NET Identity (Vue.Js)

Всем приветПишу SPA-приложение на Vue

108
Как сохранить Form в файл?

Как сохранить Form в файл?

Всем привет, недавно решил научиться делать программы в WinForms и вот такой вопрос назрел, как сохранить изменённую форму в файл, вот пример...

75