Андрей Часовских — Async/await: собираем грабли
Why Stack Overflow на русском recommends it
Stack Overflow in Russian answerers point people to it when askers misunderstand async/await, such as thinking async means multithreading, using async void, or blocking the UI.
Recommended by 2 people across 6 different months, 2016 to 2022.
What it is
A conference talk by Andrey Chasovskikh (Broadridge Financial Solutions) from .NEXT 2014 Moscow, 48 minutes long. It walks through common misconceptions and mistakes with C# async/await, explains what happens behind the technology, and ends with practical tips for writing asynchronous code.
What people said
Recommends andreycha · 2017-01 · Stack Overflow на русском · on “Асинхронность в C#”
компилятор всегда ругается, что нельзя такое делать с асинхронными методами Очень даже можно. Ну или покажите, как именно вы это делаете и что именно говорит компилятор. Вот так все работает: int RealCopyFiles(DirectoryInfo dir, IProgress<int> progress) { //... return 42; } async Task<int> CopyFiles(DirectoryInfo dir) { //... var value = await Task.Run(() => RealCopyFiles(dir, p)); // value = 42 //... return value; } UPD Поскольку метод теперь возвращает таск, этот метод тоже надо await'ить : private async void btnStart_Click(object sender, EventArgs e) { //.. int[,] crossCorelation = await test(); //<-- тут ошибка } Поскольку все это дело происходит в обработчике события, а он не может возв
Recommends andreycha · 2017-02 · Stack Overflow на русском · on “Не перехватывается выброшенное исключение”
Во время выполнения под отладчиком выпадают все исключения, отмеченные в списке Debug -> Windows -> Exception Settings ( Ctrl + Alt + E ). Это нормально. Если вы продолжите выполнение программы ( F5 ), то дальше отработают ваши catch блоки. UPD С добавление полного кода стала понятна настоящая причина, к которой предыдущий абзац не имеет никакого отношения. Проблема в этом: async void FillCurrentWeather Для полного понимания того, как работает async/await, отсылаю к видео [this video] . Здесь же вкратце опишу, что происходит при выполнении программы. Итак: В блоке try внешнего кода вызывается метод FillCurrentWeather(place); . Выполнение метода FillCurrentWeather доходит до этой строки и покидает
Recommends andreycha · 2017-04 · Stack Overflow на русском · on “Блокируется UI при использовании async-await C#”
Тот факт, что метод CheckАccess возвращает Task и вы рядом с его вызовом написали await , не делает его асинхронным. Почитайте краткое изложение [LINK] того, что делает async/await , посмотрите видео [this video] . Проблема в том, что у вас весь метод CheckАccess выполняется синхронно. Варианта решения проблемы, как уже подсказали, два: Переписать вызов WMI в асинхронный вид, если это возможно. Обернуть вызов CheckАccess или вызов WMI самого CheckАccess в Task.Run() .
Recommends andreycha · 2017-07 · Stack Overflow на русском · on “Async, await и что я делаю не так?”
async/await в методе Observe вам вроде бы действительно не нужен. Поскольку в нем не используется ключевое слово await , то Студия говорит вам о том, что и async Task не нужен. Должно получиться так: private void Observe() { while (true) { Thread.Sleep(5000); Debug.WriteLine("Observe"); } } Если вы решите оставить ключевое слово async , то теряете маленькие крохи на производительности, поскольку для таких методов компилятор генерирует специальный код, вызов которого стоит дороже, чем вызов обычного метода. Однако в методе есть один недостаток: при вызове Thread.Sleep() поток будет блокироваться и простаивать без работы. Это не очень хорошо (а иногда и вообще критично). Здесь нам как раз може
Recommends andreycha · 2017-07 · Stack Overflow на русском · on “Асинхронное выполнение метода при запуске окна”
Ключевое слово async не делает никакой магии не заставляет метод выполняться асинхронно. Почитайте [LINK] , посмотрите [this video] .
Recommends andreycha · 2018-02 · Stack Overflow на русском · on “Запуск нескольких Task одновременно. Так есть ли многопоточность?”
Прям вот жирным выделю: Асинхронность != многопоточность. Таски != многопоточность. Во-первых, многопоточности тут может не быть, если все методы возвращают готовые таски. Во-вторых, все преимущество асинхронных методов в том, что во время IO-запроса поток не блокируется и что IO-запросы могут запросто выполняться параллельно (например, потому, что это разные подсистемы вашего компьютера или разные компьютеры где-то в сети). "Обычный" асинхронный метод состоит из некоторого синхронного пролога, одного или несколько асинхронных вызовов с синхронным кодом между ними, и синхронного эпилога. В таком методе время выполнение синхронного кода и асинхронного соотносятся как, например, 1 к 100 (потом
Recommends Frehzy · 2022-06 · Stack Overflow на русском · on “Переход из синхронного контекста в асинхронный - что лучше - Task или void?”
Попробуй в `async-void` выкинуть исключение и посмотри, что будет (`throw new Exception()`). Посмотри так же видео [this video] Должно помочь разобраться вообще в теме асинхронного программирования
Recommends Frehzy · 2022-06 · Stack Overflow на русском · on “Заполнение списка в отдельном потоке”
Вы так категорично настроены против других Observable коллекций. Почему? :) Хотите параллельной загрузки - во время load вашей ViewModel делайте нужный вам запрос асинхронно и ждите результат с помощью await. Что делает await - в кратце, сохраняет ваш контекст. Вам нужно только лишь вызвать ваш async метод, добавив к вызову `await` и как-либо обработать данную информацию. Помните о том, что метод НЕ должен выполняться в UI-потоке. Посмотрите вот это видео [this video] - оно прояснит ситуацию с асинхронными методами
Cites andreycha · 2016-02 · Stack Overflow на русском · on “Нужен async/await или не нужен?”
Зачем это нужно Давайте начнем с того, зачем вообще появилась нужда в async/await . Представим, в приложении есть сетевой вызов, занимающий время. Или нужно записать большой файл на диск. Секрет в том, что в тот момент, когда вызов уходит на устройство (будь то сетевая карта или жесткий диск), текущий поток блокируется до тех пор, пока не придет ответ (т.е. пока не придет ответ от сервера или все данные не сбросятся на диск). Это расточительное использование ресурсов, поскольку в это время текущий поток ничего не делает, но мог бы заниматься другой работой. Например, на это графике видно, какую производительность выдает некое серверное приложение без использования async/await и с использован
Cites andreycha · 2016-02 · Stack Overflow на русском · on “C#. Синхронизация многопоточной записи в сокет”
В случае когда один и тот же экземпляр сокета берут несколько потоков, просто синхронизировать отправку в методе SendMessageAsync действительно не получится. Можно сделать обертку над классом Socket и синхронизировать доступ уже внутри обертки. Дополнительно нужно подключить библиотеку Nito.AsyncEx [LINK] , которая предоставляет функциональность асинхронных локов [LINK] . using Nito.AsyncEx; public class SynchronizedSocket { private readonly AsyncLock _lockObject = new AsyncLock(); private readonly Socket _socket; public SynchronizedSocket(Socket socket) { if (socket == null) { throw new AgrumentNullException(nameof(socket)); } _socket = socket; } public async Task SendMessageAsync(Socket so