Что такое консольное приложение
Перейти к содержимому

Что такое консольное приложение

  • автор:

Консольные приложения

Консольные приложения главным образом используются для выполнения вторичных или фоновых задач, таких как генерация кода, компиляция поискового индекса, отправка сообщений электронной почты и т.д. Yii предоставляет инструмент для разработки консольных приложений, придерживаясь объектно-ориентированного подхода. Он позволяет консольному приложению получить доступ к ресурсам, которые использует основное веб-приложение (например, к базе данных).

1. Обзор ¶

Каждая консольная задача представлена в Yii как команда. Консольная команда описывается в классе, наследуемом от CConsoleCommand.

После использования yiic webapp для создания начального прототипа приложения, в protected будут два файла:

  • yiic — скрипт для Linux/Unix;
  • yiic.bat — скрипт для Windows.

В консоли можно ввести следующие команды:

cd protected yiic help

После ввода будет отображён список всех доступных на данный момент команд. По умолчанию это команды, предоставляемые Yii (так называемые системные команды) и команды, разработанные для конкретных приложений (так называемые пользовательские команды).

Для получения справки по команде можно запустить

yiic help

Для запуска команды используется следующий формат:

yiic [параметры…]

2. Создание команд ¶

Консольные команды находятся в файлах с классами в папке, указанной в CConsoleApplication::commandPath. По умолчанию это protected/commands .

Класс консольной команды должен быть унаследован от CConsoleCommand. Имя класса должно быть вида XyzCommand , где Xyz соответствует имени команды, первая буква которого приведена к верхнему регистру. К примеру, команда sitemap должна использовать класс SitemapCommand . Имена консольных команд регистрозависимы.

Подсказка: Конфигурируя CConsoleApplication::commandMap, можно при желании изменить порядок именования и расположения классов команд.

Для создания новой команды необходимо либо реализовать метод CConsoleCommand::run(), либо одно или несколько действий (будут описаны далее).

При вводе консольной команды приложение запускает метод CConsoleCommand::run(). Параметры метода передаются в соответствии с следующим заголовком:

public function run($args)

где $args — дополнительные параметры, переданные из командной строки.

Внутри консольной команды для получения доступа к экземпляру консольного приложения можно использовать Yii::app() . Через полученный экземпляр можно обращаться к различным компонентам, таким как соединение с базой данных ( Yii::app()->db ). Насколько можно судить, это очень похоже на обычное веб-приложение.

Информация: Начиная с версии 1.1.1 можно создавать глобальные команды, которые используются всеми приложениями. Для этого определяется переменная окружения YII_CONSOLE_COMMANDS и в её значение записывается путь к директории с классами глобальных консольных команд.

3. Действие консольной команды ¶

Примечание: Данная возможность доступна начиная с версии 1.1.5.

Часто в консольной команде требуется работать с различными параметрами. Часть из них могут быть обязательными, а часть нет. Также может потребоваться реализовать субкоманды для выполнения различных подзадач. Всё это упрощается при использовании действий.

Действие консольной команды — метод в её классе. Имя метода должно быть вида actionXyz , где Xyz соответствует имени действия и первой буквой, приведённой к верхнему регистру. К примеру, метод actionIndex задаёт действие с именем index .

Для того, чтобы запустить определённое действие, используется следующий формат команды:

yiic  --параметр1=значение1 --параметр2=значение2 .

Дополнительные пары имя-значение передаются методу действия как именованные параметры. Значение опции xyz соответствует параметру $xyz метода действия. К примеру, если мы определим следующий класс команды:

class SitemapCommand extends CConsoleCommand < public function actionIndex($type, $limit=5) < . >public function actionInit() < . >>

То все следующие консольные команды вызовут actionIndex(‘News’, 5) :

yiic sitemap index --type=News --limit=5 // $limit принимает значение по умолчанию yiic sitemap index --type=News // $limit принимает значение по умолчанию. // Так как 'index' — действие по умолчанию, мы можем опустить имя действия. yiic sitemap --type=News // порядок опций не важен yiic sitemap index --limit=5 --type=News

Если значение опции не указано (то есть —type вместо —type=News ), соответствующему параметру действия будет присвоено значение true .

Примечание: Альтернативные форматы указания опций, такие как —type News или -t News не поддерживаются.

Если объявить параметр как массив, он сможет принять массив значений:

public function actionIndex(array $types)

Чтобы передать массив значений необходимо указать одну и ту же опцию несколько раз:

yiic sitemap index --types=News --types=Article

Команда, приведённая выше, запустит actionIndex(array(‘News’, ‘Article’)) .

Начиная с версии 1.1.6, Yii позволяет использовать анонимные параметры действий и глобальные опции.

Анонимные параметры — это параметры командной строки, не являющиеся опциями. К примеру, в команде yiic sitemap index —limit=5 News встречается анонимный параметр со значением News . Именованный параметр (опция) limit принимает значение, равное 5.

Для того, чтобы использовать анонимные параметры, действие должно описать параметр с именем $args :

public function actionIndex($limit=10, $args=array())

В массиве $args будут содержаться все доступные значения анонимных параметров.

Глобальные опции — это параметры командной строки, общие для всех действий команды. К примеру, нам может понадобиться для команды с несколькими действиями завести общую опцию verbose . Конечно, можно определить параметр $verbose для каждого действия, но лучше задать его public свойством класса команды, что автоматически сделает verbose глобальной опцией:

class SitemapCommand extends CConsoleCommand < public $verbose=false; public function actionIndex($type) >

Приведённый код позволяет использовать опцию verbose :

yiic sitemap index --verbose=1 --type=News

4. Код возврата ¶

Примечание: возможность указать код возврата в консольной команде появилась в версии 1.1.11.

При автоматическом запуске консольных команд, например, по cron или используя сервер непрерывной интеграции, важно знать, завершилось ли выполнение команды с ошибкой или успешно. Как раз для этого и предназначены коды возврата.

Данные коды являются целочисленными значениями от 0 до 254 (данный интервал задан в PHP), где 0 возвращается в случае успеха, а все остальные значения используются для различных ошибок.

Как в методе run() , так и в действиях команды вы можете вернуть целое число. Оно будет использовано в качестве кода возврата.

if (/* ошибка */) < return 1; // выходим с кодом 1 >// … всякая всячина … return 0; // всё хорошо, выходим с кодом 0

Если консольная команда ничего не возвращает, приложение завершается с кодом 0.

5. Настройка консольного приложения ¶

По умолчанию, если приложение создаётся с использованием yiic webapp , конфигурация консольного приложения находится в protected/config/console.php . Как и конфигурация веб-приложения, данный файл является PHP-скриптом, возвращающим массив с начальными значениями экземпляра консольного приложения. То есть в данном файле можно задать любое public свойство CConsoleApplication.

Так как консольные команды часто создаются для поддержки веб-приложения, требуется использовать те же ресурсы (такие, как соединения с БД), что используются в веб-приложении. Это можно сделать настроив соответствующие компоненты в конфигурации консольного приложения:

return array( . 'components'=>array( 'db'=>array( . ), ), );

Формат конфигурации очень похож на тот, что используется в веб-приложении, так как и CConsoleApplication и CWebApplication наследуют один и тот же базовый класс.

Консольные приложения

К сожалению, в винде такая консоль, что лучше бы мои глаза ее не видели. Я пока не начал писать под линукс, тоже не понимал ценности консольных приложений. В никсах консоль на порядок удобнее и красивее, и писать под нее намного легче, чем под виндовскую.

12 ноя 2011 в 10:37

С позиции CLI разницы в консолях ( System.Console ) под различные ОС нет. Не подскажете, в чём же всё-таки состоят различия?

12 ноя 2011 в 11:21

Во-первых, внешний вид винконсоли вызывает во мне тоску. Линуксовые терминалы (gnome-terminal, konsole и т.д.) на порядок симпатичнее. И шрифт там нормальный, длина строки нефиксированная, и куча других удобств. Про набор команд я не говорю. Вроде бы PowerShell это решил. Я не очень знаком с C#, не знаю как там управляется терминал, т.е. как изменить цвет шрифта, фона и т.д. В винде на низком уровне это делается с помощью API функций, в никсах -при помощи управляющих последовательностей, что на порядок проще и приятней. В винде вроде в консоли большие проблемы с русской кодировкой.

12 ноя 2011 в 15:37

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Есть разные виды приложений и их классификаций. Одна из них: приложения бывают трансформирующие, интерактивные и реактивные (реального времени). Так вот, первые из них, трансформирующие, характеризуются тем, что берут данные на входе (упрощённо — входной файл), работают какое-то время, обязательно конечное, и выдают результаты (упрощённо — в выходной файл). Таких задач очень много и участие человека там в процессе минимально. (Частный случай — это подзадачи какого-то интерактивного приложения). Вот для них и нужны консольные приложения. Ну и плюс интерактивные задачи, где диалог — не графический, а текстовый. Где-то так. Ну и задачи реального времени редко бывают с графическим интерфейсом. Плюс всякие сервера (http, ftp и т.д.)

Отслеживать
ответ дан 12 ноя 2011 в 6:19
7,313 16 16 серебряных знаков 14 14 бронзовых знаков
ага понятно, спасибо.
12 ноя 2011 в 6:41

На самом деле, большинство приложений являются именно консольными или вообще не имеют пользовательского интерфейса. Сюда относятся различные серверные приложения, службы, трансформирующие приложения, упомянутые выше и т.д. и т.п.

Дело в том, что консоль — это всего лишь форма пользовательского интерфейса. И реализовать такой интерфейс обычно проще, чем графический. Основная логика программы не зависит от интерфейса, поэтому обучение эффективнее строить на консольных программах. Кроме того, консольные приложения проще тестировать и отлаживать.

Наконец, консольный интерфейс, часто оказывается удобнее и эффективнее графического. Просто современные пользователи не привыкли пользоваться консолью и не знают возможностей современных консолей. Почитайте книгу Джефа Раскина про интерфейсы. Там много про это говорится.

Консольное приложение

Текстовый интерфейс пользователя (англ. Text user interface, TUI ; также Character User Interface, CUI ) — система средств взаимодействия пользователя с компьютером, основанная на использовании текстового (буквенно-цифрового) режима дисплея или аналогичных устройств — например, командная строка. Приложения, использующие текстовый интерфейс, называют консольными программами.

Особенности текстового интерфейса

На программном уровне для ввода и вывода информации консольные программы используют стандартные устройства ввода-вывода (stdin, stdout, stderr), хотя могут открывать и другие файлы, сетевые соединения и совершать иные действия, доступные в выполняющей их среде. Вывод печатных символов в stdout и stderr приводит к появлению этих символов на устройстве вывода, то есть к их получению пользователем.

В простейшем случае консольная программа использует интерфейс командной строки, однако многие из таких программ с помощью управляющих последовательностей терминалов создают более дружественный интерфейс, приближающийся к графическому (см.: меню (информатика)).

Некоторые консольные программы пригодны лишь для определённой реализации текстового интерфейса, например, текстовые программы операционных систем, особенно библиотека

Реализация текстового интерфейса

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

Классической реализацией текстового интерфейса, восходящей к первой половине XX века, является алфавитно-цифровое устройство ввода-вывода, например, комплект из клавиатуры и АЦПУ (телетайпа). Впоследствии вместо АЦПУ стали применять мониторы, снабжённые знакогенератором, что позволило быстро и удобно организовывать диалог с пользователем. Подобными устройствами снабжён или может быть снабжён почти каждый современный компьютер. Такие комплекты из монитора и клавиатуры (иногда с добавлением мыши) называются консолью компьютера.

В соответствии с традицией использования консольными программами клавиатуры и АЦПУ для ввода и вывода соответственно взаимодействие таких программ с пользователем свелось к чтению из stdin и выводу на stdout. Таким образом, появилась возможность перенаправлять потоки ввода-вывода, осуществляя взаимодействие с пользователем посредством иных устройств, в том числе подключенных через сеть, а также при помощи специальных программ-эмуляторов терминала, например, рисующих окно с текстом в графическом интерфейсе пользователя (текстовое окно).

В 1970-х годы и позднее выпускались даже специальные устройства, реализующие текстовый интерфейс — текстовые терминалы, подключаемые через последовательный порт к компьютеру напрямую или через модем. С распространением персональных компьютеров функции текстового терминала, как правило, выполняет компьютер, тот, на котором выполняется консольная программа, или другой. Программы ssh (а также Интернет или локальную сеть. Программы konsole и многие другие реализуют текстовый интерфейс посредством текстового окна в среде X Window System.

Альтернативный подход к консольному выводу был использован в персональных компьютерах, в частности (хотя не только), IBM PC под управлением памяти, связанной со знакогенератором монитора, приводя к немедленному изменению видимых на мониторе данных. Такие программы могут также работать в среде Microsoft Windows. Более того, Windows имеет поддержку текстовых окон, во многом превосходящую имевшуюся в DOS, в том числе и для приложений собственно Windows.

Примеры консольных программ

  • Любая программа, осуществляющая получение данных от пользователя путём чтения stdin и отправку данных пользователю путём записи в stdout, по определению является консольной программой. Однако, такие программы могут обходиться и безо всякого пользователя, например обрабатывая данные из файлов.
  • Текстовые программы для видеопамять Microsoft Windows.
  • Unix shell, а также все утилиты, предназначенные для работы в этой среде.
  • Midnight Commander (UNIX), FAR Manager (Windows).
  • pppstatus, top, htop (UNIX).

См. также

Wikimedia Foundation . 2010 .

Консольное приложение

Это руководство раскроет для вас некоторые возможности .NET и языка C#. Вы узнаете:

  • общие сведения о .NET CLI;
  • структура консольного приложения C#;
  • консольный ввод-вывод;
  • основные сведения об интерфейсах API файлового ввода-вывода в .NET;
  • основные сведениях об асинхронном программировании задач в .NET.

Вам предстоит создать приложение, которое считывает текстовый файл и выводит его содержимое в консоль. Вывод в консоль осуществляется с такой скоростью, которая позволяет читать текст вслух. Вы можете ускорить или замедлить темп, нажав клавиши «» (больше). Это приложение можно запустить в ОС Windows, Linux, macOS или в контейнере Docker.

В этом руководстве описано множество функций. Попробуем собрать их по одному.

Предварительные требования

  • Пакет SDK для .NET 6.
  • Редактор кода.

Создание приложения

Первым шагом является создание нового приложения. Откройте командную строку и создайте новый каталог для приложения. Перейдите в этот каталог. В командной строке введите команду dotnet new console . Эта команда создает начальный набор файлов для базового приложения Hello World.

Прежде чем вносить изменения, давайте запустим простое приложение Hello World. Когда вы создадите приложение, наберите в командной строке команду dotnet run . Эта команда запускает процесс восстановления пакета NuGet, создает исполняемый файл приложения и запускает этот файл.

Весь код простого приложения Hello World размещается в файле Program.cs. Откройте этот файл в любом текстовом редакторе. Замените код в Program.cs на следующий код:

namespace TeleprompterConsole; internal class Program < static void Main(string[] args) < Console.WriteLine("Hello World!"); >> 

В верхней части файла вы видите инструкцию namespace . Как и другие объектно ориентированные языки, с которыми вы могли работать ранее, C# использует пространства имен для организации типов. В нашей программе Hello World все точно так же. Как вы видите, программа находится в пространстве имен TeleprompterConsole .

Чтение и вывод файла

Первая функция, которую мы добавим, будет считывать данные из текстового файла и выводить полученный текст в консоль. Сначала нам нужно добавить текстовый файл. Скопируйте в каталог проекта файл sampleQuotes.txt из репозитория GitHub для этого примера. Он будет источником текста для вашего приложения. Чтобы скачать пример приложения для этого раздела, воспользуйтесь инструкциями в разделе Примеры и руководства.

Теперь добавьте в класс Program (он расположен сразу за методом Main ) следующий метод:

static IEnumerable ReadFrom(string file) < string? line; using (var reader = File.OpenText(file)) < while ((line = reader.ReadLine()) != null) < yield return line; >> > 

Этот метод является особым типом метода C#, который называется методом итератора. Методы итератора возвращают последовательности, которые оцениваются отложенно. Это означает, что каждый элемент в последовательности создается только в тот момент, когда к нему выполняется обращение в коде обработки последовательности. Методы итератора — это методы, содержащие один или несколько yield return операторов. Возвращаемый методом ReadFrom объект содержит код для создания каждого элемента последовательности. В нашем примере он читает следующую строку текста из исходного файла и возвращает эту строку. Каждый раз, когда вызывающий код запрашивает следующий элемент из последовательности, код считывает из файла и возвращает следующую строку текста. Когда файл закончится, последовательность сообщает, что в ней больше нет элементов.

Здесь используются два элемента синтаксиса C#, которые могут быть для вас новыми. Инструкция using в этом методе управляет освобождением ресурсов. Переменная, которая инициализируется в инструкции using (в нашем примере это reader ) должна реализовывать интерфейс IDisposable. Этот интерфейс определяет единственный метод ( Dispose ), который вызывается для освобождения ресурса. Компилятор создает такой вызов, когда выполнение кода достигает закрывающей скобки инструкции using . Созданный компилятором код гарантирует освобождение ресурса даже в том случае, если в блоке кода, определенном инструкцией using, будет создано исключение.

Переменная reader определена с ключевым словом var . Ключевое слово var определяет неявно типизированную локальную переменную. Это означает, что тип переменной определяется во время компиляции по типу объекта, присвоенного этой переменной. Здесь это возвращаемое значение метода OpenText(String), то есть объект StreamReader.

Теперь давайте создадим в методе Main код для чтения файла:

var lines = ReadFrom("sampleQuotes.txt"); foreach (var line in lines)

Запустите программу командой dotnet run и убедитесь в том, что все текстовые строки выводятся в консоль.

Добавление задержек и форматирование выходных данных

Сейчас данные отображаются слишком быстро для чтения. Поэтому нам нужно добавить задержку в процесс вывода. Для этого вы создадите несложный код, выполняющий асинхронную обработку. Но первые наши действия будут нарушать стандартные рекомендации. Эти нарушения мы укажем в комментариях при создании кода, а затем заменим этот код в последующих шагах.

В этом разделе описаны два действия. Во-первых, обновите метод итератора, чтобы он возвращал не всю строку целиком, а каждое слово отдельно. Для этого внесите такие изменения. Замените инструкцию yield return line; следующим кодом:

var words = line.Split(' '); foreach (var word in words) < yield return word + " "; >yield return Environment.NewLine; 

Теперь следует изменить код обработки строк файла, добавив задержку после вывода каждого слова. Замените инструкцию Console.WriteLine(line) в методе Main на такой блок кода:

Console.Write(line); if (!string.IsNullOrWhiteSpace(line)) < var pause = Task.Delay(200); // Synchronously waiting on a task is an // anti-pattern. This will get fixed in later // steps. pause.Wait(); >

Запустите пример и проверьте выходные данные. Теперь слова появляются по одному и с задержками по 200 мс. Но пока с выводом сохраняются некоторые проблемы, поскольку в исходном текстовом файле есть несколько строк длиной более 80 символов, и они выводятся без перевода строки. Это не очень удобно читать с прокруткой. Но эту проблему легко исправить. Вам нужно лишь отслеживать длину каждой строки и создавать новую строку каждый раз, когда эта длина достигает определенного порога. После объявления words в методе ReadFrom объявите локальную переменную для хранения длины строки:

var lineLength = 0; 

Теперь добавьте следующий код после инструкции yield return word + » «; (перед закрывающей фигурной скобкой):

lineLength += word.Length + 1; if (lineLength > 70)

Запустите пример, и теперь вы сможете читать текст вслух в заданном темпе.

Асинхронные задачи

И на последнем этапе мы добавим код, который позволяет выполнять две асинхронные задачи, одна из которых — вывод текста, а вторая — ожидание ввода от пользователя для ускорения, замедления или прекращения вывода текста. Этот этап разделяется на несколько шагов, по завершении которых вы получите все необходимые обновления. Первым шагом является создание асинхронной задачи (Task), которая возвращает метод с тем кодом, который вы создали ранее для чтения и отображения файла.

Добавьте следующий метод в класс Program . Этот текст основан на тексте метода Main :

private static async Task ShowTeleprompter() < var words = ReadFrom("sampleQuotes.txt"); foreach (var word in words) < Console.Write(word); if (!string.IsNullOrWhiteSpace(word)) < await Task.Delay(200); >> > 

Вы можете заметить два изменения. Во-первых, в тексте нет вызова Wait(), который в синхронном режиме ожидает завершения задачи. Вместо него в этой версии используется ключевое слово await . Чтобы это работало, в сигнатуру метода нужно добавить модификатор async . Этот метод возвращает Task . Обратите внимание, что здесь нет инструкции для возвращения объекта Task . Вместо этого объект Task создается в коде, который компилятор предоставляет в точке использования оператора await . Представьте, что метод завершает выполнение при достижении await . Он возвращает Task в знак того, что работа еще не завершена. Метод возобновит свою работу, когда завершится ожидаемая задача. Когда работа метода завершится, это будет отражено в возвращаемом объекте Task . Вызывающий код может отслеживать состояние полученного Task , чтобы определить момент завершения метода.

await Добавьте ключевое слово перед вызовом : ShowTeleprompter

await ShowTeleprompter(); 

Для этого необходимо изменить сигнатуру Main метода следующим образом:

static async Task Main(string[] args) 

Дополнительные сведения о методе async Main см. в разделе «Основы».

Затем необходимо написать второй асинхронный метод для чтения из консоли и watch для ключей «» (больше) и «X» или «x». Для выполнения этой задачи добавьте приведенный ниже метод.

private static async Task GetInput() < var delay = 200; Action work = () =>< do < var key = Console.ReadKey(true); if (key.KeyChar == '>') < delay -= 10; >else if (key.KeyChar == ' <') < delay += 10; >else if (key.KeyChar == 'X' || key.KeyChar == 'x') < break; >> while (true); >; await Task.Run(work); > 

При этом создается лямбда-выражение для представления делегата Action , который считывает ключ из консоли и изменяет локальную переменную, представляющую задержку, когда пользователь нажимает клавиши «» (больше). Метод делегата завершается, когда пользователь нажимает клавиши «X» или «x», что позволяет пользователю в любое время остановить отображение текста. Этот метод использует метод ReadKey(), чтобы блокировать выполнение и ожидать нажатия клавиши.

Чтобы завершить создание этой функции, нам нужна новая инструкция async Task , которая вернет метод, запускающий обе задачи ( GetInput и ShowTeleprompter ) и управляющий обменом данными между этими задачами.

Пришло время создать класс, который может обрабатывать совместное использование данных двумя задачами. Этот класс содержит два открытых свойства: delay (задержка) и флаг Done , который означает, что файл прочитан полностью:

namespace TeleprompterConsole; internal class TelePrompterConfig < public int DelayInMilliseconds < get; private set; >= 200; public void UpdateDelay(int increment) // negative to speed up < var newDelay = Min(DelayInMilliseconds + increment, 1000); newDelay = Max(newDelay, 20); DelayInMilliseconds = newDelay; >public bool Done < get; private set; >public void SetDone() < Done = true; >> 

Поместите этот класс в отдельный новый файл и включите его в пространство имен TeleprompterConsole , как показано выше. Также следует добавить оператор using static в верхнюю часть файлами, чтобы можно было ссылаться на методы Min и Max без указания имени внешнего класса или пространства имен. Инструкция using static импортирует все методы из одного класса. Это отличается от оператора using без static , который импортирует все классы из пространства имен.

using static System.Math; 

Теперь вам нужно обновить методы ShowTeleprompter и GetInput для использования нового объекта config . И еще одна инструкция Task , которая возвращает метод async , запускающий обе задачи и завершающий работу после окончания первой задачи:

private static async Task RunTeleprompter()

Новым методом здесь является WhenAny(Task[]). Этот метод создает задачу ( Task ), которая завершается сразу, как только завершится любая из задач в списке аргументов.

Теперь вам нужно обновить методы ShowTeleprompter и GetInput , чтобы они использовали объект config для задержки:

private static async Task ShowTeleprompter(TelePrompterConfig config) < var words = ReadFrom("sampleQuotes.txt"); foreach (var word in words) < Console.Write(word); if (!string.IsNullOrWhiteSpace(word)) < await Task.Delay(config.DelayInMilliseconds); >> config.SetDone(); > private static async Task GetInput(TelePrompterConfig config) < Action work = () =>< do < var key = Console.ReadKey(true); if (key.KeyChar == '>') config.UpdateDelay(-10); else if (key.KeyChar == ' <') config.UpdateDelay(10); else if (key.KeyChar == 'X' || key.KeyChar == 'x') config.SetDone(); >while (!config.Done); >; await Task.Run(work); > 

Новая версия метода ShowTeleprompter вызывает новый метод из класса TeleprompterConfig . Сейчас нужно изменить метод Main , чтобы вместо ShowTeleprompter он вызывал RunTeleprompter :

await RunTeleprompter(); 

Заключение

В этом учебнике мы продемонстрировали вам ряд функций языка C# и библиотек .NET Core, связанных с работой в консольных приложениях. На основе полученных знаний вы сможете развивать свои представления о языке и представленных здесь классах. Вы увидели базовые примеры использования файлового и консольного ввода-вывода, асинхронного программирования на основе задач с блокировкой и без блокировки. Вы узнали о языке C# и структуре программ на C#, а также о .NET CLI.

Дополнительные сведения о файловом вводе-выводе см. в статье Файловый и потоковый ввод-вывод. Дополнительные сведения о модели асинхронного программирования, используемой в учебнике, см. в статьях Асинхронное программирование на основе задач и Асинхронное программирование.

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *