Почему всё выводится в одну строку?
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 полю
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема с тем, что весь вывод отображается в одну строку, может возникать по разным причинам. Одной из основных причин может быть отсутствие или неправильное использование символа новой строки в вашем коде.
Для того чтобы корректно вывести текст с использованием символов новой строки в PHP, вы можете воспользоваться функцией nl2br(), которая заменяет символы новой строки на тег
.
Пример: