powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зачем нужен await?
25 сообщений из 252, страница 8 из 11
Зачем нужен await?
    #39684674
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>Petro123, вчера, 19:17 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21633388][21633388]
>...Оператор await используется для ожидания.
<Может быть так:
В коде вызывающего метода оператор await используется для ожидания завершения кода вызванного метода. Коды других методов, обработчиков сообщений, могут работать асинхронно.
Это противоречит? Уточняет? Добавляет эмоции?
Зачем ты это написал?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684678
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRесли вызов async-метода производится не из UI-потока,это когда нибудь требуется? Или это чисто абстрактно?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684685
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Prokealon(Ruslan)ConfigureAwait(false) просто разрешает выполнять твой контекст в любом потоке, UI-поток не исключениеConfigureAwait(false) разрешает выполнять продолжение в том же потоке, но меня пока интересует обратная ситуация...именно что в любом
Код: plaintext
true to attempt to marshal the continuation back to the original context captured; otherwise, false.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684701
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRОткуда такое заблуждение? Вся та статья как раз и посвящена доказательству того что это не так (что контекст синхронизации не переходит через await, а значит, если вызов async-метода производится не из UI-потока, то и продолжение не будет выполнятся в UI-потоке, что бы там в ConfigureAwait не задавалось).

Зачем ему переходить? И почему заблуждение? Сейчас покажу.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private async void button1_Click(object sender, EventArgs e)
{
    button1.Text = await Task.Run(async delegate
    {
        string data = await DownloadAsync();
        
        // вот это будет работать, в этом смысл использования await в UI )))
        button1.Text = "как в этой точке UI-поток может получить управление?";
        
        return Compute(data);
    });
}



LRВот как в этой точке UI-поток может получить управление?

Давайте от обратного. Если он его там не получит, то невозможно в продолжении взаимодействовать с UI. Если UI поток не может выполнять код после await где-то внутри цепочки вызовов функций, значит невозможно будет написать сколько-нибудь серьёзный код с использованием await.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684704
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009]
>...Зачем ты это написал?
<Я так думаю.
UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684708
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009]
>...Зачем ты это написал?
<Я так думаю.
UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684709
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProЯ всегда пишу ConfigureAwait(false) кроме начальных вызовов из UI-потока, даже если и не в библиотеках.

Это нужно делать только в библиотеках, которые однозначно не взаимодействуют с UI и которым не требуется контекст синхронизации.

Shocker.ProПолучается, что если ConfigureAwait(false) где-то забыл, то мы получим продолжение в контексте синхронизации независимо от глубины вложенности await-ов. При этом если забыли ConfigureAwait(false) на N-ом уровне вложенности, продолжение N-ого уровня выполнится в UI-потоке, и все по цепочке N-1, N-2... обратно к началу вызовов начнет выполняться в UI-потоке, потому что ConfigureAwait(false) разрешит не менять поток при продолжении. Теперь я правильно понял?

Да, глубина вложенности не имеет значения, так как компилятор строит конечный автомат.
Ну примерно, да :)

Вот хорошая заметка.

http://andrey.moveax.ru/post/csharp-async-wait-deadlocks
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684713
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё есть такой трюк

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
private async void Button_Click(object sender, RoutedEventArgs e)
{
    await AsyncHelper.RedirectToThreadPool();
    // всё, мы больше не в UI-контексте, гарантировано

    HttpClient httpClient = new HttpClient();
    string content = await httpClient.GetStringAsync("http://www.microsoft.com"); 
    // ...
}



(источник)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684727
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЗачем ему переходить? И почему заблуждение? Сейчас покажу.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
private async void button1_Click(object sender, EventArgs e)
{
    button1.Text = await Task.Run(async delegate
    {
        string data = await DownloadAsync();
        
        // вот это будет работать, в этом смысл использования await в UI )))
        button1.Text = "как в этой точке UI-поток может получить управление?";
        
        return Compute(data);
    });
}


Это работать не будет. Будет System.InvalidOperationException: 'Cross-thread operation not valid: Control 'button1' accessed from a thread other than the thread it was created on.'

hVosttДавайте от обратного. Если он его там не получит, то невозможно в продолжении взаимодействовать с UI. Если UI поток не может выполнять код после await где-то внутри цепочки вызовов функций, значит невозможно будет написать сколько-нибудь серьёзный код с использованием await.
Весьма странный довод.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684728
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДа, глубина вложенности не имеет значения, так как компилятор строит конечный автомат.
Ну примерно, да :)То есть, если я напишу грубо говоря
Код: c#
1.
2.
await Task.Delay(1);
Text1.Text="UI";

это будет работать, из какого бы метода это не было вызвано?
hVosttЭто нужно делать только в библиотеках, которые однозначно не взаимодействуют с UI и которым не требуется контекст синхронизации.Ну если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684729
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕщё есть такой трюк

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
private async void Button_Click(object sender, RoutedEventArgs e)
{
    await AsyncHelper.RedirectToThreadPool();
    // всё, мы больше не в UI-контексте, гарантировано

    HttpClient httpClient = new HttpClient();
    string content = await httpClient.GetStringAsync("http://www.microsoft.com"); 
    // ...
}



(источник)
Чета я не допираю.
INotifyCompletion
Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684742
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>Petro123, сегодня, 10:57 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1300144&msg=21634009] [21634009]
>...Зачем ты это написал?
<Я так думаю.
UI поток продолжает обработку сообщений и другие методы могут осуществлять обмен. Собственно приложение ничего не ждет.
Не нужно додумывать за MS.
У МS термин ожидание это не form.ShowModal; из дельфи прошлого века.
Где код ГУИ встал на этой строчке.
Ожидание потока имеется ввиду.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684877
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProНу если это код хелпера, например, внутри проекта, который не взаимодействует с UI, зачем мне его выполнять в UI?

Ну может это хелпер, который может обновлять ProgressBar. Или ещё что-то делать. Серьёзные приложения имеют сложность, которая не укладывается код обработчиков событий. Код слишком большой, чтобы размещать его там, если интенсивно используются асинхронные операции. Ну и MVP/MVVM никто не отменял :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684878
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProТо есть, если я напишу грубо говоря
Код: c#
1.
2.
await Task.Delay(1);
Text1.Text="UI";


это будет работать, из какого бы метода это не было вызвано?

Если в цепочке вызовов везде будет await, да.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684880
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли в цепочке вызовов везде будет await, да.А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684908
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttЕсли в цепочке вызовов везде будет await, да.А какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?

В общем, LR действительно прав в том, что при вызове Task.Run текущий контекст синхронизации никак не передаётся в асинхронные вызовы внутри полученного потока для выполнения задачи. Он остаётся на точке await Task.Run.

Прошу прощения, что ввёл в заблуждение. Правда, что контекст сохраняется в цепочке вызовов на любом уровне, но не передаётся внутрь запущенных потоков.

Т.е. внутри Task.Run, ConfigureWait не влияет на выполнение.

В таком варианте, грубо:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
await Some1(...)
   ...
   await Some2(...)
      ...
      await Some3(...)
         ...
         await Some4(...)
         ...
      ...
   ...



Это работает.

А теперь немного треша,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
            label1.Text = await await Task.Factory.StartNew(
                async () =>
                {
                    label1.Text = "button1_Click: thinking";
                    await Task.Delay(TimeSpan.FromSeconds(3));
                    return "button1_Click: done!!";
                },
                CancellationToken.None,
                TaskCreationOptions.None,
                TaskScheduler.FromCurrentSynchronizationContext());



Два await это не ошибка :)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684919
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВЧета я не допираю.
INotifyCompletion
Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?

Для await нужен объект с методом GetAwaiter
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684920
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProА какая разница, будет он или нет? Или ты имеешь ввиду, что код словит дедлок, потому что на Result будет заблокирован UI-поток?

По поводу вопроса, ещё раз. Если ты вызовешь Wait или Result на таске вместо await, а внутри будет await без ConfigureAwait(false) будет гарантированный дедлок.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684939
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Petro123, сегодня, 12:14 [21634132]

>...Где код ГУИ встал на этой строчке…
<Стоит как миленький, и обработчики работают, и прогресс бар показывает:
object[][] psp = new object[3][];
psp[0] = new object[2] { "x_nazvanie", xstr };
psp[1] = new object[2] { "x_dt_begin", (DateTime)dpr_Начало.SelectedDate };
psp[2] = new object[2] { "x_dt_end", (DateTime)dpr_Конец.SelectedDate };
при.tmrStart(); await Task.Run(() => wsp.Entity_SP("NCUYAO_GIS.VD_Inspek_Sel", wsp.sp_Sel, psp, RowToEntity)); при.tmrStop();
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684961
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕвгенийВЧета я не допираю.
INotifyCompletion
Нафига у ThreadPoolRedirector другие члены окромя OnCompleted?

Для await нужен объект с методом GetAwaiter
Т. е. для решение проблемы, о которой можно сказать, хз, есть она или нет, скорее всего нет, если механизмом async/await пользоваться только там, где он предназначен используется следующее решение -

"Используйте механизм, о котором в документации явно сказано, что это инфраструктура и нефик юзать в прикладном коде (как минимум могут изменить механизм), при чем эта инфраструктура юзает утиную типизацию. А само "решение" гарантированно подменяет пул потоков созданный специально для тасков, на пул ThreadPool существующий со времен царя Гороха."
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684962
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

В сложных прогах лучше не пользоваться асинк авейт думаю - фиг концов найдешь потом
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684963
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
Открой наконец для себя возможности форматирования кода!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684987
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВТ. е. для решение проблемы, о которой можно сказать, хз, есть она или нет, скорее всего нет, если механизмом async/await пользоваться только там, где он предназначен используется следующее решение -

"Используйте механизм, о котором в документации явно сказано, что это инфраструктура и нефик юзать в прикладном коде (как минимум могут изменить механизм), при чем эта инфраструктура юзает утиную типизацию. А само "решение" гарантированно подменяет пул потоков созданный специально для тасков, на пул ThreadPool существующий со времен царя Гороха."

Ну в целом, знать как это устроено внутри полезно, но для использования нужно абстрагироваться. Нужно было бы. Если бы C# изначально проектировался с async/await, возможно получился бы простой и лёгкий синтаксис, как в Go.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684991
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRoshVostt,

В сложных прогах лучше не пользоваться асинк авейт думаю - фиг концов найдешь потом

Мы проект написали полностью async-first.

Из плюсов:

1. Асинхронный вызов можно встроить в любой точке на любой глубине кода.
2. Высокопроизводительное решение для обработки огромного числа запросов пользователей.

Из минусов:

1. Дофига await.
2. Дофига ConfigureAwait(false) -- помогают расширения решарпера и рослин, можно автоматизировать процесс.
3. В некоторых случаях, функциональный подход (аля промисы) -- лучше, для этого приходится оборачивать async/await (дожили).
4. Все минусы меркнут перед сложностью отладки. Нет, IDE не встанет заботливо на точку по месту ошибки. Те, кто привыкли так работать страдают и воют как кони. Но если изначально отказываться от разработки через отладку, проблем нет.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39685000
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttМы проект написали полностью async-first.

Из плюсов:

1. Асинхронный вызов можно встроить в любой точке на любой глубине кода.
Чет ты перегнул.
Как вставить по стеку в глубине, если async не поддерживает стек?
...
Рейтинг: 0 / 0
25 сообщений из 252, страница 8 из 11
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зачем нужен await?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]