Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 8 [9] 10 11   вперед  Ctrl      все
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
Petro123
Чет ты перегнул.
Как вставить по стеку в глубине, если async не поддерживает стек?


ну заведомо синхронные методы -- синхронные, без фанатизма, их намного больше.
но все сервисы, службы, шины, менеджеры, и прочее -- асинхронные.
8 авг 18, 18:39    [21634880]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
hVostt,

Ну, понятно. async First это просто "делайте чаще чтобы гуи не морозило))
8 авг 18, 18:46    [21634886]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
hVostt

Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go.

А что в GO такого легкого и простого?
Ужасные горутины и каналы?
Просто мерзкая обработка ошибок?
И никакого ГУЯ!
8 авг 18, 19:06    [21634894]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
ЕвгенийВ
А что в GO такого легкого и простого?
Ужасные горутины и каналы?
Просто мерзкая обработка ошибок?
И никакого ГУЯ!


почему ужасные? сравнивать напрямую нельзя конечно, так как другая парадигма.

кстати, в .NET тоже будут каналы, скоро.
пока в глубокой бете.
8 авг 18, 19:12    [21634899]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
hVostt
будут каналы, скоро.
вот я не понимаю почему сабж со стеком не работает?
Bool Metod1{
   if (Metod2(contextDb)) {
       CreateMap();
       CopyMap();
       return true;
   }

Вот как вставить асинхронный метод в метод2?
8 авг 18, 19:23    [21634906]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
Petro123
вот я не понимаю почему сабж со стеком не работает?


что ты имеешь в виду?


Petro123
Вот как вставить асинхронный метод в метод2?


сделать Metod2 асинхронным _)
8 авг 18, 19:34    [21634914]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
ЕвгенийВ
Member

Откуда: Москва
Сообщений: 4673
hVostt

почему ужасные? сравнивать напрямую нельзя конечно, так как другая парадигма.

Ужасные - это касалось горутин. Обычный запуск задачи в отдельном потоке.

hVostt
кстати, в .NET тоже будут каналы, скоро.
пока в глубокой бете.

Про каналы ничего не имею против, особенно когда они допускают межпроцессорное и межкомпьютерное взаимодействие.
В .NET они уже были 9 лет назад.
Axum
Введение в язык программирования Axum
8 авг 18, 19:35    [21634915]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
hVostt
сделать Metod2 асинхронным _)
как сделать без замены возврата bool?
Этод метод вызывается в куче мест.
8 авг 18, 19:54    [21634923]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
hVostt
что ты имеешь в виду?
CreateMap() будет вызвана до окончания потока внутри метода2.
8 авг 18, 19:57    [21634924]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1970
>Petro123, сегодня, 18:38 [21634878]
>...Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют…
<Что-то не понимаю:

К сообщению приложен файл. Размер - 31Kb
8 авг 18, 20:04    [21634931]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
ЕвгенийВ
Ужасные - это касалось горутин. Обычный запуск задачи в отдельном потоке.


Почему в отдельном потоке? Это уж как повезёт :)


ЕвгенийВ
Про каналы ничего не имею против, особенно когда они допускают межпроцессорное и межкомпьютерное взаимодействие.
В .NET они уже были 9 лет назад.


https://www.nuget.org/packages/System.Threading.Channels :)
8 авг 18, 20:29    [21634944]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
Petro123
как сделать без замены возврата bool?
Этод метод вызывается в куче мест.


никак, либо две версии метода
8 авг 18, 20:30    [21634945]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
ВМоисеев
<Что-то не понимаю:


Код на скрне полностью синхронный.
8 авг 18, 20:31    [21634947]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1970
>hVostt, сегодня, 20:31 [21634947]

>Код на скрне полностью синхронный.
<А так:

К сообщению приложен файл. Размер - 18Kb
8 авг 18, 21:03    [21634986]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
ВМоисеев,

И чего? Вы точку останова поставили.
Речь идёт о сваливании с исключением и остановкой дебагера на этом месте.
8 авг 18, 21:12    [21634996]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
hVostt
По поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок.
По поводу вложенности еще раз. Если await без ConfigureAwait(false) на первом уровне - то дедлок понятен, а если, к примеру, первый-второй уровень вложенности идет с ConfigureAwait(false), а на третьем забыли. Будет ли дедлок и если да, то почему?
9 авг 18, 05:01    [21635258]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
Shocker.Pro
По поводу вложенности еще раз. Если await без ConfigureAwait(false) на первом уровне - то дедлок понятен, а если, к примеру, первый-второй уровень вложенности идет с ConfigureAwait(false), а на третьем забыли. Будет ли дедлок и если да, то почему?


Вот тут всё ок.

        private async void button1_Click(object sender, EventArgs e)
        {
            label1.Text = await TestAsync();            
        }

        private async Task<string> TestAsync()
        {
            label1.Text = "button1_Click: TestAsync running";
            await TestTestAsync().ConfigureAwait(false);
            // продолжение будет выполнено в другом потоке, отличном от UI
            return "button1_Click: TestAsync result";
        }

        private async Task TestTestAsync()
        {
            // вызов этого метода с ConfigureAwait() не влияет на выполнение этого метода
            await Task.Delay(TimeSpan.FromSeconds(1));
            // продолжение будет выполнено в UI потоке
            label1.Text = "button1_Click: TestTestAsync running";
        }


А здесь будет ошибка

        private async void button1_Click(object sender, EventArgs e)
        {
            label1.Text = await TestAsync();            
        }

        private async Task<string> TestAsync()
        {
            label1.Text = "button1_Click: TestAsync running";
            await Task.Delay(TimeSpan.FromSeconds(1)).ConfigureAwait(false);
            // продолжение будет выполнено в другом потоке, отличном от UI
            // и это означает, что вызов TestTestAsync() не получит контекст синхронизации UI            
            await TestTestAsync();            
            return "button1_Click: TestAsync result";
        }

        private async Task TestTestAsync()
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
            // здесь будет ошибка, так как контекст синхронизации был потерян
            label1.Text = "button1_Click: TestTestAsync running";
        }
9 авг 18, 10:23    [21635498]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
Shocker.Pro,

Необходимо понимать, что ConfigureAwait на сам вызов метода не влияет, только на продолжение.

Для кода, выполняемого после ConfigureAwait контекст потерян, и там уже не имеет значения, есть ConfigureAwait или нет.
9 авг 18, 10:25    [21635502]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
hVostt
Необходимо понимать, что ConfigureAwait на сам вызов метода не влияет, только на продолжение.
это я понимаю. Я не понимаю какой-то другой нюанс в твоем изначальном примере и пытаюсь его нащупать...

Я, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать
Спасибо.
9 авг 18, 11:16    [21635616]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
hVostt
Сейчас проекты пишутся async-first. Всё хорошо.
При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?
9 авг 18, 11:17    [21635619]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2369
Вот пример, где ConfigureAwait(false) не спасает от дедлока, это только у меня так? (WinForms, VS2017, FW 4.5.2-4.6.2)
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Text = FindAsync("https://www.sql.ru/forum/1300144-9/zachem-nuzhen-await",
                "Будет ли дедлок").Result;
        }
        private async Task<string> FindAsync(string uri, string s)
        {
            var data = await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false);
            return s + " - " + (data.IndexOf(s) >= 0 ? "найдено!" : "не найдено.");
        }

ConfigureAwait(false) лишь отменяет требование выполнять продолжение в первоначальном контексте, т.е., дает "добро" на любой контекст, в т.ч. не исключая первоначальный. В данном примере, вероятно, async-инфраструктуре "влом" идти и брать свободный поток из пула, и выбирается то, что "под боком" - а это (уже блокированный ожиданием .Result) UI-поток.
Или все происходит как-то по другому? Может кто-нибудь проверить этот пример у себя?
9 авг 18, 11:35    [21635677]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro
hVostt
Сейчас проекты пишутся async-first. Всё хорошо.
При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?
забить студия не даст.
9 авг 18, 11:57    [21635733]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 20320
Petro123
забить студия не даст.
С чего вдруг не даст? Даже решарпер - и тот не настаивает.
9 авг 18, 12:05    [21635751]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
hVostt
Member

Откуда:
Сообщений: 15397
Shocker.Pro
Я, похоже, вот какой момент не до конца осознавал... при вызове асинхронного метода (в том числе каскадно) его (их) операторы будут выполняться в вызвавшем потоке до первого встреченного await-а. Я воспринимал, что операторы сразу начнут выполняться в другом потоке. И, кажется, я это знал, но забыл )) Отсюда все мои предыдущие вопросы можно аннулировать


Да, до первого await, который вернёт незавершённую задачу (важное уточнение), всё будет синхронно.

Shocker.Pro
При этом используется суффикс Async в названии каждого метода? Или забили, потому что они вообще все асинхронные?


Нет, не забили. Все асинхронные методы имеют суффикс Async. Контролируется на этапе сборки.
9 авг 18, 13:09    [21635911]     Ответить | Цитировать Сообщить модератору
 Re: Зачем нужен await?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 38643
Shocker.Pro
Petro123
забить студия не даст.
С чего вдруг не даст? Даже решарпер - и тот не настаивает.

хм... Проверил, ты прав. Убрал суффикс и не ругается.
9 авг 18, 13:10    [21635914]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 5 6 7 8 [9] 10 11   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить