пишу программу, работающую с несколькими модемами. Для ускорения работы использую 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 минуты). Но как в этом убедиться и что делать дальше?
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");
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пишу приложение для того чтобы выводить журналы Windows в нужном мне видеРади пробы написал консольную прогу, которая просто извлекает все записи...
Всем привет, недавно решил научиться делать программы в WinForms и вот такой вопрос назрел, как сохранить изменённую форму в файл, вот пример...