Занимаюсь разработкой на.net более 8 лет. Долгое время разрабатывал решения на winforms/wpf/wcf/aspmvc, в последние годы ушел в веб разработку на angular(react)/.net core/postgre. В свободное время исследую кросплатформеные решения, например за capacitor от команды ionic, пушу на github в opensource для yandex карт. 2
= new TaskCompletionSource<int>(); var operation = new LegacyAsyncOperation(); operation.Completed += result => { tcs.SetResult(result); }; return tcs.Task; } 14
new CancellationTokenSource(TimeSpan.FromSeconds(10)); using (var client = _httpClientFactory.CreateClient()) { var response = await client.GetAsync("http…", cts.Token); return await response.Content.ReadAsStreamAsync(); } } Оказывают нагрузку на очередь таймеров (начнет очищаться после 10 с., плохо при большом кол-ве запросов ) 17
{ using (var streamWriter = new StreamWriter(context.Response.Body)) { await streamWriter.WriteAsync("Hello World"); } }); Поскольку данные могут быть помещены в буфер при записи то dispose будет выполняться синхронно, это приведет к блокировке потока и переполнению пула. 21
return CallDependencyAsync(); } Преимущества - асинхронные и синхронные исключения становятся асинхронными - Упрощает отладку, при exception - Исключения автоматически обернуться таском. Минусы - трансформация кода в state machine. 23
var person = _cache.GetOrAdd(id, (key) => db.People.FindAsync(key).Result); return Ok(person); } } - ConcurrentDictionary Подходит для кеширования асинхронных операций. getoradd возвращает или добавляет элемент. Для получения значения из неправильно будет написать .Result тк это приведет к истощению пула потоков. - Кешируйте таски, а не результат, там где нужно await и уже получать результат - thread pool starvation. 26
async Task<IActionResult> Get(int id){ var person = await _cache.GetOrAdd(id, (key) => db.People.FindAsync(key)); return Ok(person); } } - ConcurrentDictionary Подходит для кеширования асинхронных операций. getoradd возвращает или добавляет элемент. Для получения значения из неправильно будет написать .Result тк это приведет к истощению пула потоков. - Кешируйте таски, а не результат, там где нужно await и уже получать результат - thread pool starvation. 27
[HttpGet("/pokemon")] public ActionResult<PokemonData> Get() { var json = new StreamReader(Request.Body).ReadToEnd(); return JsonConvert.DeserializeObject<PokemonData>(json); } } 34
{ await context.Response.WriteAsync("Hello "); await next(); // This may fail if next() already wrote to the response context.Response.Headers["test"] = "value"; }); 45
члены включаются быстро в работу 3. Просто менять бизнес правила 4. CI CD 5. Новые языки и платформы. Docker Host auth service микросервис каталог авто микросервис заказов e v e n t b u s api Клиенты IOS/Android Angular/React 1 2 48
microservice N …… r o u t e r подписка на сообщения rabbitmq на базе конфигурации consul проверка доступа и авторизация message microservice message Message Handler 49 R a b b i t H u b
try { if (this.handlers.TryGetValue(topic, out var handler) ) { // могло возникнуть синхронное поведение через асинхронное. result = await handler.Execute(dm).ForAwait(); } ….. } ... } 50 async await messageHandler
Повышение масштабируемости ▪ MessageHandler работает асинхронно ▪ Пишем асинхронный callstack хендлера ▪ Экономим ThreadPool, один поток может обслужить N задач Плюсы