не использует методы блокирования, внутренний класс помощника имеет некоторые тонкие ошибки.
Использование APM с классом состояния сеанса, экземпляры которого управляют буферным и буферным курсором, совместно использованным через вызовы и реализацию обратного вызова, которая переносится EndRead
в try...catch
. В нормальном функционировании последняя вещь try
, который должен сделать блок, настраивается следующий перекрытый обратный вызов ввода-вывода с вызовом к BeginRead()
.
то, Когда вещи спутываются, catch
, должно асинхронно вызвать делегата в методе перезапуска. Реализация обратного вызова должна сразу выйти после catch
блок так, чтобы логика перезапуска могла уничтожить текущую сессию (состояние сеанса почти наверняка повреждено) и создают новую сессию. Метод перезапуска должен не быть реализованным на классе состояния сеанса, потому что это препятствовало бы тому, чтобы он уничтожил и воссоздал сессию.
, Когда объект SerialPort закрывается (который произойдет, когда приложение выйдет) может быть незаконченная операция ввода-вывода. Когда это будет так, закрытие SerialPort инициирует обратный вызов, и при этих условиях EndRead
выдаст исключение, которое неотличимо от общего comms shitfit. Необходимо установить флаг в состоянии сеанса для запрещения поведения перезапуска в catch
блок. Это будет мешать Вашему методу перезапуска вмешаться в естественное завершение работы.
на Эту архитектуру можно положиться для не содержания на объект SerialPort неожиданно.
метод перезапуска справляется с закрытием и повторным открытием объекта последовательного порта. После вызова Close()
на эти SerialPort
объект звоните Thread.Sleep(5)
, чтобы дать ему шанс отпустить. Для чего-то еще возможно захватить порт, так быть готово иметь дело с этим при повторном открытии его.
В ответ на каждый из моих вопросов:
1) В чем мое непонимание форматов .NET и Windows?
Короткий ответ: нет связи между Время »в настройках« Язык и региональные стандарты »и в свойстве .NET ShortTimePattern. Однако свойство LongTimePattern определяется настройкой «Long Time».
Я адаптировал описанный выше метод, заменив две строки форматирования на:
string sixAmString = sixAm.ToString("T", culture.DateTimeFormat);
string sixPmString = sixPm.ToString("T", culture.DateTimeFormat);
Вот результат:
Culture: en-GB, 6AM: 06:00:00, 6PM: 18:00:00 // HH:mm:ss Culture: en-GB, 6AM: 06:00:00 AM, 6PM: 06:00:00 PM //hh:mm:ss tt
Внизу этой статьи объяснил мне проблему.
2) Как лучше всего создать строку времени в коротком формате (ЧЧ: мм или чч: мм tt) на основе настроек операционной системы?
Я не знаю о лучшее решение, но я создал следующую функцию, которая преобразует LongTimeFormat в ShortTimeFormat, тем самым позволяя приложению следовать параметрам пользователей, если они изменяют «Долгое время» (хотя оно не будет отслеживать настройку «Кратковременное время»).
static string GetShortTimeString(DateTime ShortTimeString)
{
DateTimeFormatInfo dateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat;
string ShortTimePattern = dateTimeFormat.LongTimePattern.Replace(":ss", String.Empty);
ShortTimePattern = ShortTimePattern.Replace(":s", String.Empty);
return ShortTimeString.ToString(ShortTimePattern);
}
Результат после внесения вышеуказанных изменений:
Culture: en-GB, 6AM: 06:00, 6PM: 18:00 Culture: en-GB, 6AM: 06:00 AM, 6PM: 06:00 PM
Параметр P / Invoke должен использовать GetTimeFormat , передавая TIME_NOSECONDS с использованием DateTime.ToString (Format), как указано выше. Я не тестировал это, так как предпочел бы избегать использования P / Invoke.
Ответ на ваш второй вопрос:
DateTimeFormat.Format(DateTime.Now, "t", CultureInfo.CurrentUICulture);
или
DateTime.Now.ToString("t", CultureInfo.CurrentUICulture);
На самом деле всегда лучше использовать явные методы, принимающие CultureInfo. Нет единообразия в том, как .Net выбирает, что использовать по умолчанию: CurrentCulture, CurrentUICulture или InvarinatCulture.
Чтобы дать полный ответ. Также я обозначу различия между культурами.
Итак, CurrentCulture - это «Панель управления -> Часы, язык и регион -> Регион и язык -> вкладка« Форматы »». Это культура, которой вы ожидаете от своих расчетов. Например, вы можете вести учет в США, поэтому вы должны настроить это в США.
CurrentUICulture - это «Регион и язык -> Язык отображения». Это означает, что если вы эмигрант из Украины, вы хотите, чтобы ваше приложение было локализовано в UA (но все вычисления все еще производятся в США).
И InvariantCulture - это так называемый языковой стандарт, не зависящий от культуры. Вы должны использовать это для хранения информации и так далее. Фактически это En-US.
Примечание: я могу ошибаться, когда каждая настройка находится в окнах. Но у вас, наверное, есть идея.