Re[9]: Зачем нам асинхронность?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 09.08.20 08:09
Оценка: 1 (1)
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, Serginio1, Вы писали:


S>>>>Вместо awaite File.ReadAllTextAsync нужно создавать бэкграунд поток, передавать в него метод в котором вызывать в итоге File.ReadAllText

_>>>Потому что для однопользовательского случая такая задача масштабируется гораздо лучше.
S>> И чем это лучше? Ты запускаешь отдельный поток. Который нихрена не делает, только ожидает когда данные считаются.

_>И в чём проблема с этим? ) Речь же не про тысячу таких потоков, а про один. )

Ты так и не ответил чем лучше?
S>>При этом морозит вспомогательный поток через объекты синхронизации до получения данных.

_>С чего бы это?


S>> При awaite File.ReadAllTextAsync данные передаются сразу в главный поток или если использовать .ConfigureAwaite(false) в любой поток.

S>> Чем это маштабируется то лучше?

_>Потому что помимо просто чтения файла в реальном мире у тебя будет ещё и какая-то его минимальная обработка. Например его парсинг. Если использовать твою схему с awaite File.ReadAllTextAsync, где по твоему будет происходить обработка? Если изначальный вызов был у тебя в UI потоке, то и обработка пойдёт там же. И это даже будет нормально работать у тебя на небольших файликах. А потом пользователь загрузит туда гигабайтный файл и всё твоё приложение зависнет на неопределённое время. А для варианта с отдельным потоком, никаких проблем не будет — просто подольше будет идти обработка, но без всяких зависаний приложения.


Обработка будет либо в главном потоке при без .ConfigureAwaite(false) либо в любом потоке из пула при .ConfigureAwaite(false)
я же написал. Ты можешь регулировать, в отличие от твоего подхода.
Ну и если хочется оформи парсинг через Task и примени awaite

awaite Task.Factory.StartNew(()=>СинхронныйПарсинг(),
                    TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness);

Шедулер сам решить где запускать или продолжить задачу
https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.taskcreationoptions?view=netcore-3.1
_>Ты сейчас наверное скажешь, что правильный программист сразу же выделит парсинг в отдельный поток, как потенциально длительную операцию. Вот только тогда сразу появляется простейший вопрос: а зачем нам тогда нужен асинхронный ввод-вывод, если у нас и так создаётся поток под эту задачу?

Еще раз async awaite итак использует пул потоков. Незачем создавать еще свои потоки. При работе в контексте синхронизации
при .ConfigureAwaite(true) продолжение происходит в главном потоке для модификации контролов.
Уже все организовано. И незачем самому, изобретать велосипед!
Ты читал хоть
https://stackoverflow.com/questions/47741546/is-an-iocp-a-thread-that-is-running-while-the-i-o-is-taking-place-or-after

В .Net уже существуют настройки над IOCP
Не надо забывать и про кроссплатформенность. Да тот же Xamarin.Forms он кроссплатформенный, ну сервера на любой платформе
И не надо изобретать велосипед там, где он уже создан

Кроме тог в том, же Blazor.WebAssembly нет многопоточности, но есть асинхронность
https://github.com/dotnet/aspnetcore/issues/14253
и солнце б утром не вставало, когда бы не было меня
Отредактировано 10.08.2020 8:34 Serginio1 . Предыдущая версия . Еще …
Отредактировано 10.08.2020 6:48 Serginio1 . Предыдущая версия .
Отредактировано 09.08.2020 13:40 Serginio1 . Предыдущая версия .
Отредактировано 09.08.2020 13:38 Serginio1 . Предыдущая версия .
Отредактировано 09.08.2020 13:32 Serginio1 . Предыдущая версия .
Отредактировано 09.08.2020 13:32 Serginio1 . Предыдущая версия .
Отредактировано 09.08.2020 13:28 Serginio1 . Предыдущая версия .
Отредактировано 09.08.2020 9:15 Serginio1 . Предыдущая версия .
Отредактировано 09.08.2020 9:08 Serginio1 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.