Владислав
Только нужно говорить, что этот метод долгий и можно пока мне другую работу кинуть
Владислав
А что не так?
Владислав
Task.wait блокирует основной поток
Владислав
Я тебе и говорю
Владислав
Тебе не нужно параллелить все
Владислав
Через Parallel.For
NIX
Если ваша задача ограничена производительностью ввода-вывода, используйте async и await без конструкции Task.Run. Библиотеку параллельных задач использовать не следует. Причина этого указана в статье Подробный обзор асинхронного программирования.
Владислав
Он сам все распаралеллит
NIX
от говорит про Task.Run
NIX
Что его нельзя
NIX
во время ожидания
Владислав
А он нужен?
Владислав
Его не запрещают
Владислав
Они говрят, что можно обойтись
NIX
ну мне же предложили его использовать
Владислав
Это примеры
Владислав
Чтобы ты понял
Владислав
В реальности используется он в 100 раз реже await/async
Владислав
Если он тебе нужен - жди беды
Владислав
Любой выход из потока нужно синхронизировать
Владислав
Async await автоматом синхронизирует
Владислав
А там нужно ручками все делать
NIX
в общем я понял следующе: Есть пул потоков, о котором позаботились майки В его функцию входит выполнение задач, которые есть в программах, к тому же эти потоки могут ожидать ответа, как async/await , занимаясь в свободное время другой задачей
Владислав
Да
NIX
но эти потоки необходимо синхронизировать
Владислав
Вс кто разжевано в у албахари
Владислав
Нет
Владислав
Не необходимо
Владислав
Await заменяет код, который это делает
Владислав
Весь код в шарпе, сецчас
Владислав
Функциональный
Владислав
Состояние приложения находится в бд
Владислав
Редисе
Владислав
И тд
Владислав
В задачах, где нужно хранить состояние - нужны более сложные сопособы синхронизации
Владислав
Например - лонгпул
Владислав
Long pool
Владислав
Или webhook, как теб удобней
Владислав
Там уже нужны semaphore, ManualResetEvent и тд
NIX
это всё строится на принципах асинхронной модели на основе задач (TAP)?
Владислав
Да
Владислав
Раньше было не так кст
Stas
так
Владислав
История долгая
Stas
using System; using System.Net.Http; using System.Runtime.InteropServices; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { public class HttpClienReal { //public HttpClienReal() //{ // HttpRequestRealMethodAsync(); // //AnyLongOperation(); //} //public void AnyLongOperation() //{ // for (int i = 0; i < 10; i++) // { // Console.WriteLine(i); // } //} public async Task<string> HttpRequestRealMethodAsync() { HttpClient Client = new HttpClient(); var s = await Client.GetStringAsync("http://cherokee-project.com/"); Console.WriteLine("Method work"); return s; } public async Task<string> WHttpRequestRealMethodAsync() { HttpClient Client = new HttpClient(); var s = await Client.GetStringAsync("http://cherokee-project.com/"); Console.WriteLine("Method work2"); return s; } //async void HttpTask() //{ // var t = await HttpRequestRealMethodAsync(); // Console.WriteLine(t.Result); //} } private static async Task Main() { try { HttpClienReal real = new HttpClienReal(); for (int i = 0; i < 10; i++) { Task<string> t = real.HttpRequestRealMethodAsync(); string tt = await t; //Console.WriteLine(tt); } for (int i = 0; i < 10; i++) { RunAsyncMethodAsync(real); } for (int i = 0; i < 10; i++) { Console.WriteLine(i); } Console.ReadLine(); } catch (HttpRequestException e) { Console.WriteLine("Error Network" + e); } catch { Console.WriteLine("Exeption"); } } public void AnyLongOperation() { for (int i = 0; i < 10; i++) { Console.WriteLine(i); } } private static async void RunAsyncMethodAsync(HttpClienReal real) { Task<string> t = real.WHttpRequestRealMethodAsync(); string tt = await t; //Console.WriteLine(tt); } } }
Владислав
Пережитки остались
Stas
вот твой код
Владислав
Так
Владислав
Да
Владислав
С теорией я обьяснил
Stas
я вынес работу внутри второго цикла в отдельный асинхронный метод
Владислав
Вот практика
Stas
и всё работает ок
Stas
без всяких Task.Run
Владислав
Task.run вс кравно что goto
Владислав
Не ясно что и куда
Stas
С примером по скорости чтото не задалось) в субботу если будет время придумаю
Владислав
Тут главное принцип понять
Владислав
Где Лонг оперецшен можно thread.sleep
Владислав
Все равно Мейн блочит
Владислав
Кстати
Владислав
Task.delay
Владислав
Тоже через await
Stas
да
Владислав
Я ему)
NIX
отлично!
NIX
Вот этот код меня радует)
NIX
спасибо
NIX
В цитате ты видимо хотел мне сказать почему это не работало раньше, но у меня не открывает
NIX
можешь кинуть ссылку?
NIX
Причина всегда важна
NIX
да, усыпить поток можно в цикле
NIX
но так бы я не смог проверить асинхронность, к тому е это усыпило бы всю прогу
NIX
поток то один
NIX
или тут тое пул задействуется?
Владислав
Все таски в пуле
Stas
Ещё раз, асинрон в том месте где ты используешь async метод именно он тебе вернёт управление, а там где await это синхронное выполнение, строчка за строчкой
Владислав
Но не всегда там больше 1 потока
Владислав
Там сложные алгоритмы
Владислав
Так же как и со сборкой мусора