Почему всё выводится в одну строку?

Ссылка скопирована
1 ответ
void RunLoader(char ch, int sleepTime) {     Console.WriteLine();     for (int i = 0; i < 40; i++)     {         Thread.Sleep(sleepTime);         Console.Write(ch);     } }  void Run1() => RunLoader('2', 10); void Run2() => RunLoader('1', 100);  Parallel.Invoke(Run1, Run2);

void RunLoader(char ch, int sleepTime) { Console.WriteLine(); for (int i = 0; i < 40; i++) { Thread.Sleep(sleepTime); Console.Write(ch); } } void Run1() => RunLoader('2', 10); void Run2() => RunLoader('1', 100); Parallel.Invoke(Run1, Run2);

22222221222222212222222122222212222222212222211111111111111111111111111111111111dotnet watch ⏳ Waiting for a file to change before restarting dotnet...

P.S:
Работает если просто вызвать, асинхронно тоже, но параллельно почему-то нет
Должно выводить две новых строки, которые заполняются цифрами 2 и 1.

P.S2:

Thread.CurrentThread.Name = "Main";  // Create a task and supply a user delegate by using a lambda expression. Task taskA = new Task( () => {     for (int i = 0; i < 40; i++)     {          Console.Write(1);          Thread.Sleep(50);     } });  Task taskB = new Task( () => {     for (int i = 0; i < 40; i++)     {          Console.Write(2);          Thread.Sleep(10);     } }); // Start the task. Console.WriteLine(); taskA.Start(); Console.WriteLine(); taskB.Start();

Thread.CurrentThread.Name = "Main"; // Create a task and supply a user delegate by using a lambda expression. Task taskA = new Task( () => { for (int i = 0; i < 40; i++) { Console.Write(1); Thread.Sleep(50); } }); Task taskB = new Task( () => { for (int i = 0; i < 40; i++) { Console.Write(2); Thread.Sleep(10); } }); // Start the task. Console.WriteLine(); taskA.Start(); Console.WriteLine(); taskB.Start();

Дополнительно:

не, ну ты мутишь..
в коде:
Console.Write(ch);а потом

Console.WriteLine(); taskA.Start(); Console.WriteLine(); taskB.Start();

Console.WriteLine(); taskA.Start(); Console.WriteLine(); taskB.Start();

... ты определись..
в таске и бросай что то из https://habr.com/ru/articles/165597/

P.S:

Работает если просто вызвать, асинхронно тоже, но параллельно почему-то нет

и не будет по сути - консоль (системы) последовательный процесс
... если ты осмыслил остальное, то обдумай что я говорю

pps опробуй все тоже на winforms/wpf и так далее ( в разные окна вывода...
а консоль то одна...
можешь в линуксе проверить... (хоть в wsl...

ppps хотя... консолью можно управлять и координатно (в соответствии с текущей размерностью)... (тот же мой любимый far это консольная программа)..
но там точно уже не Console.WriteLine()...
или winapi или линуксовые api... как то так...
в винде far
в линуксе - mc
.. это консольные программы, оба проекта опенсорц ;)
.. есть esc-последовательности для управления курсором.. думаю для простейшего прогресс-бара хватило бы.. иначе - апи ОС, примеры выше

  • Доку по строкам я почитаю потом, мне нужно готовое решение, я изучаю асинхронность, потом пройдусь по работе со строками и прочей базе.

    Суть в демонстрации многопоточности, я хочу видеть две строки которые одновременно заполняются в консоли, что-то типа загрузки пакета в линуксе: [######....]

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

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

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

  • historydev,

    Суть в демонстрации многопоточности, я хочу видеть две строки которые одновременно заполняются в консоли, что-то типа загрузки пакета в линуксе: [######....]

    консоль во всех системах - однопоточный ВЫВОД (даже если сама таска не однопоточная..

    ЭТО КОНСОЛЬ

  • historydev, WinForms. Wpf, Avalonia... etc
  • хоть в wsl - по моему не надо советовать всл
  • сергей кузьмин, ну как песочница, частенько сойдет ))
  • historydev,

    Доку по строкам я почитаю потом, мне нужно готовое решение, я изучаю асинхронность, потом пройдусь по работе со строками и прочей базе.

    ну и рубись в лоб )))
    удачи )))

Ответы:

Потому что нигде в коде нет перевода строки

  • Console.WriteLine();
  • А какой результат ожидается?
  • Дмитрий, Каждый вызов метода пишет в одну новую строку:
    1111111111111111 2222222222222222 3333333333333333 ....

    1111111111111111 2222222222222222 3333333333333333 ....

  • historydev,
    Console.Write(ch);

Потому что Console.Write(ch);
В консоли всего один курсор => после всех переносов будет всё в одну строку писаться.

  • А как мне сделать задуманное?
  • historydev, что задумано - не очень понятно.. об инструментах, см у меня в ответе
  • historydev, а что задумано то?)
  • historydev, если хочется чтобы каждый прогресс бар увеличивался независимо, то тогда надо отдельному потоку делегировать управление консолью - там отслеживать текущую строку и позицию и дописывать куда надо.
  • historydev, глянь эту либу: https://github.com/goblinfactory/progress-bar/
    Там вроде решена твоя задача.
  • Василий Банников, оч прикольная штука... очень... но 3 года в заморозке (((
  • Василий Банников, я пока ничего о потоках не знаю, я пытаюсь добиться поведения как в js с промисами, где достаточно setTimeout вызвать для подобного эффекта.

    То есть мне нужны не таски, а потоки разные?

    Сейчас попробую пример, спасибо

  • historydev, можно таски. Тут главная проблема не в потоках, а в том что консолью нужно из одного места управлять.
    Таки в js ты тоже через setTimeout не сможешь сделать то, что хочешь.
  • #, по факту 6 )
    Благо он под netstandart
  • historydev, есть ещё https://www.nuget.org/packages/ShellProgressBar
  • Василий Банников, В js я не консолью управлял, а менял ширину элементов
  • historydev, ну так консоль и разметка - это разное
  • Василий Банников, ну как сказать ))
    https://github.com/goblinfactory/progress-bar/comm...
    хотя может удачное решение netstandart, особо ни чего и не требует ))
  • #, ну так список смерженных это подтверждает - 6 лет без апдейтов.
    4 года назад только одно свойство публичное добавили для получения доступа к private полю
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Виктор Sys Ответ

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

Для того чтобы корректно вывести текст с использованием символов новой строки в PHP, вы можете воспользоваться функцией nl2br(), которая заменяет символы новой строки на тег
.

Пример:

$text = "Пример текста с символами

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

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

Вам также может быть интересно