ЗаписьДанных.ЗакрытьАсинх

Методы · CloseAsync

Асинхронная функция. Инициирует вызов метода СброситьБуферы. Если целевой поток был создан при создании объекта ЗаписьДанных, также вызывает начало закрытие целевого потока.

Синтаксис

ЗакрытьАсинх()
Полное описание, параметры и ограничения

ЗаписьДанных.ЗакрытьАсинх (DataWriter.CloseAsync)

ЗаписьДанных (DataWriter)

ЗакрытьАсинх (CloseAsync)

Доступен, начиная с версии 8.3.18.

Синтаксис:
ЗакрытьАсинх()
Возвращаемое значение:
Тип: Обещание.
Результат выполнения обещания - Неопределено.
Описание:

Асинхронная функция. Инициирует вызов метода СброситьБуферы. Если целевой поток был создан при создании объекта ЗаписьДанных, также вызывает начало закрытие целевого потока.

Доступность:

Тонкий клиент, толстый клиент.

См. также:
ЗаписьДанных, метод НачатьЗакрытие
ЗаписьДанных, метод Закрыть

Использование в версии:

Доступен, начиная с версии 8.3.18.

Методическая информация

Практические примеры

Асинхронно перенести срез буфера и обработать неполное чтение

Из ABCDEFG переносим CDE, затем читаем один байт в новый буфер и остаток в заранее выделенную область.

Где и как запускать

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.

&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
    ИсходныйБуфер = ПолучитьБуферДвоичныхДанныхИзСтроки("ABCDEFG", КодировкаТекста.UTF8, Ложь);
    Поток = Новый ПотокВПамяти;
    Запись = Новый ЗаписьДанных(Поток);
    Попытка
        Ждать Запись.ЗаписатьБуферДвоичныхДанныхАсинх(ИсходныйБуфер, 2, 3);
        Ждать Запись.ЗакрытьАсинх();
    Исключение
        Запись.Закрыть();
        Поток.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
    Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Сообщить(ПолучитьСтрокуИзДвоичныхДанных(Данные, КодировкаТекста.UTF8) = "CDE");
    Чтение = Новый ЧтениеДанных(Данные);
    Попытка
        НовыйБуфер = Ждать Чтение.ПрочитатьВБуферДвоичныхДанныхАсинх(1);
        Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(НовыйБуфер, КодировкаТекста.UTF8) = "C");
        Существующий = ПолучитьБуферДвоичныхДанныхИзСтроки(".....", КодировкаТекста.UTF8, Ложь);
        Прочитано = Ждать Чтение.ПрочитатьВБуферДвоичныхДанныхАсинх(Существующий, 1, 3);
        Сообщить(Прочитано = 2);
        Сообщить(ПолучитьСтрокуИзБуфераДвоичныхДанных(Существующий, КодировкаТекста.UTF8) = ".DE..");
        Ждать Чтение.ЗакрытьАсинх();
    Исключение
        Чтение.Закрыть();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

Разбор по шагам

  1. Срез записи начинается с нулевого индекса 2, то есть C, и содержит три байта CDE.

  2. Ждать метода записи обеспечивает завершение переноса до закрытия потока.

  3. Перегрузка чтения с количеством 1 возвращает новый буфер C.

  4. Перегрузка с существующим буфером возвращает число, здесь 2: в источнике осталось только DE.

  5. Незаписанные точки остаются прежними данными. Проверяем весь пятибайтовый буфер .DE...

Как проверить результат

  1. Скопировано CDE, первый буфер C, фактически прочитано 2, существующий буфер .DE..; четыре сообщения Истина.

  2. Исходный буфер ABCDEFG не изменяется от записи его среза в другой поток.

Ожидаемый результат

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

На что обратить внимание

  1. Количество — байты, не буквы. Исходный набор ASCII делает смещения однозначными.

  2. Диапазон записи должен находиться внутри буфера; пример не расширяет его за пределы размера.

  3. Не сравнивайте Обещание с числом 2: сначала получите фактический результат через Ждать.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Асинхронно записать и прочитать четыре числовых поля по порядку

Полный клиентский обработчик использует Ждать для каждой операции. Чтение начинается только после закрытия записи и получения данных.

Где и как запускать

Модуль пустой управляемой формы учебной внешней обработки; тонкий или толстый клиент Windows. Вставьте весь модуль. Это не серверный код.

Подготовка

  1. Создайте учебную внешнюю обработку с пустой управляемой основной формой. Создайте команду УчебныйПример и кнопку этой команды.

  2. В свойстве команды Действие выберите процедуру УчебныйПример. Вставьте полный приведённый модуль формы.

  3. Откройте EPF в тонком или толстом клиенте Windows и нажмите кнопку. Не переносите Ждать и Асинх в серверный общий модуль.

  4. Пример работает только со своими данными в памяти; записи в базу, файлы и сеть нет.

  5. Имя кнопки формы должно быть КнопкаУчебныйПример. Если назвали иначе, переименуйте кнопку в дереве элементов формы.

  6. Доступность меняется у кнопки, не у команды. На время ожидания кнопка отключена для защиты от повторного запуска.

&НаКлиенте
Асинх Процедура УчебныйПример(Команда)
    Элементы.КнопкаУчебныйПример.Доступность = Ложь;
    Поток = Новый ПотокВПамяти;
    Запись = Новый ЗаписьДанных(Поток);
    Попытка
        Ждать Запись.ЗаписатьБайтАсинх(7);
        Ждать Запись.ЗаписатьЦелое16Асинх(4660, ПорядокБайтов.LittleEndian);
        Ждать Запись.ЗаписатьЦелое32Асинх(16909060, ПорядокБайтов.BigEndian);
        Ждать Запись.ЗаписатьЦелое64Асинх(4294967296, ПорядокБайтов.LittleEndian);
        Ждать Запись.СброситьБуферыАсинх();
        Ждать Запись.ЗакрытьАсинх();
    Исключение
        Запись.Закрыть();
        Поток.Закрыть();
        Элементы.КнопкаУчебныйПример.Доступность = Истина;
        ВызватьИсключение;
    КонецПопытки;
    Данные = Поток.ЗакрытьИПолучитьДвоичныеДанные();
    Чтение = Новый ЧтениеДанных(Данные);
    Попытка
        Версия = Ждать Чтение.ПрочитатьБайтАсинх();
        Поле16 = Ждать Чтение.ПрочитатьЦелое16Асинх(ПорядокБайтов.LittleEndian);
        Поле32 = Ждать Чтение.ПрочитатьЦелое32Асинх(ПорядокБайтов.BigEndian);
        Поле64 = Ждать Чтение.ПрочитатьЦелое64Асинх(ПорядокБайтов.LittleEndian);
        Конец = Ждать Чтение.ПрочитатьБайтАсинх();
        Сообщить(Данные.Размер() = 15);
        Сообщить(Версия = 7 И Поле16 = 4660 И Поле32 = 16909060 И Поле64 = 4294967296);
        Сообщить(Конец = Неопределено);
        Ждать Чтение.ЗакрытьАсинх();
    Исключение
        Чтение.Закрыть();
        Элементы.КнопкаУчебныйПример.Доступность = Истина;
        ВызватьИсключение;
    КонецПопытки;
    Элементы.КнопкаУчебныйПример.Доступность = Истина;
КонецПроцедуры

Разбор по шагам

  1. Асинх ставится у клиентской процедуры. Ждать извлекает результат обещания; без него переменная содержала бы Обещание, а не число.

  2. Четыре записи выполняем последовательно, не запускаем параллельные операции над одним потоком.

  3. Сбрасываем буферы, закрываем запись, затем закрываем свой ПотокВПамяти с получением данных.

  4. Читаем поля теми же ширинами и порядками байтов, после них проверяем конец дополнительным байтовым чтением.

  5. Синхронное закрытие в исключении допустимо именно в указанном клиенте Windows; веб-клиент для этого модуля не заявлен.

Как проверить результат

  1. Три контрольных сообщения Истина; пакет 15 байтов, версия 7.

  2. После окончания/обрабатываемой ошибки кнопка снова доступна. В рабочую базу записи нет.

Ожидаемый результат

Завершён последовательный асинхронный цикл записи и чтения учебного пакета.

На что обратить внимание

  1. Асинхронные методы этой группы доступны на клиенте, не на сервере.

  2. Асинх не делает операции потокобезопасными. Два одновременных чтения одного экземпляра не нужны.

  3. Не используйте пример как универсальную реализацию для браузера: подготовка ограничена Windows-клиентом.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.