powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Зачем нужен await?
25 сообщений из 252, страница 6 из 11
Зачем нужен await?
    #39682473
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКак заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)замена в исходниках по регулярке )))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682479
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttShocker.Proпропущено...
Моветон, но он не запрещен, и в существующих проектах может присутствовать. Кроме того, это способ использовать await в обработчиках событий.

Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)нет.
У меня проект, где я в цикле делаю await и результат мне нужен без Task<...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682480
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСледующий вопрос, может кто решал.

Как заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)Да никак. Но можно локально убить контекст синхронизации.
Код: c#
1.
2.
3.
4.
Task.Run(async () =>
{
    ...
});
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682482
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123hVosttпропущено...


Будем говорить честно, такая возможность "оставлена" только из-за обработчиков событий :)нет.
У меня проект, где я в цикле делаю await и результат мне нужен без Task<...причем тут результат и void???
Так или иначе ты можешь запустить метод с таском без ожидания результата, для этого тебе void необязателен.
Как правильно говорит Хвост, void оставлен только для сохранения сигнатуры для событий
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682486
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КДа никак. Но можно локально убить контекст синхронизации.
Код: c#
1.
2.
3.
4.
Task.Run(async () =>
{
    ...
});



Ну это понятно.

В общем, тут очевидно, что сделали слегка по-дебильному.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682490
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВ общем, тут очевидно, что сделали слегка по-дебильному.Слегка - не то слово!
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682493
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,
Ты про то чтобы убрать слово void тут?
private async void MyRun()
Ну, это и коню понятно что не надо трогать.
Чтобы убрать await я тоже против.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682496
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, Ещё камень в авторов ConfigureAwait .
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682497
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt, Ещё камень в авторов ConfigureAwait .

Согласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682499
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttНо сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Ну да. HttpContext.Current там нет, а значит и контекст синхронизации там ни к чему.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682501
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Библиотеки все таки не часто пишем.
А core пока ещё не ГУИ.
Так что пока не наезжайте на сабж) сильно.
))
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682505
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttСогласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Но временнЫе затраты на переключение контекста ведь никто не отменял...
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39682509
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttСогласен. Если ты пишешь библиотеки, задолбаешься писать ConfigureAwait(false).

Но сейчас решили это так, в ASP.NET Core вообще убрали контекст синхронизации Но временнЫе затраты на переключение контекста ведь никто не отменял...

Никто не отменял, поэтому ConfigureAwait(false) приходится втыкать.

Ещё есть такая штукенция https://github.com/Fody/ConfigureAwait

Но такие вещи нужно применять с осторожностью.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39683112
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProhVosttКак заставить компилятор вставлять ConfigureAwait(false) для всех await вызовов в рамках модуля, или хотя бы файла? :)замена в исходниках по регулярке )))
У нас есть Roslyn
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684143
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt, Ещё камень в авторов ConfigureAwait .
Это далеко не все тараканы

https://www.infoworld.com/article/2960463/application-development/my-two-cents-on-synchronizationcontext-async-and-await.html
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684149
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684255
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Есть такой онекдот. Доктор, почему когда я сильно заворачиваю руку за спину, сгибаюсь и прыгаю на одной ноге, через какое-то время мне становится больно? Не делайте так.

И вот, пример, который я ждал с самого начала статьи:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void button1_Click(object sender, EventArgs e)
{
    button1.Text = await Task.Run(async delegate
    {
        string data = await DownloadAsync();
        return Compute(data);
    });
}



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

И так многие делают.

Вот два решения проблемы:

1. заставим наш говнокод работать

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
private void button1_Click(object sender, EventArgs e)
{
    button1.Text = await Task.Run(async delegate
    {
        string data = await DownloadAsync().ConfigureAwait(false);
        return Compute(data);
    });
}



2. включим мозг и напишем по-людски

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private void button1_Click(object sender, EventArgs e)
{
    string data = await DownloadAsync();

    // если вычислительная операция действительно сложная и долговременная, 
    // запустим в отдельном потоке
    button1.Text = await Task.Run(() => Compute(data));

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

    // а вот все IO операции должны быть асинк
}



Глобально решают задачу, отказываюсь от контекста синхронизации совсем. Остаётся execution flow, и с блокировками нужно по-аккуратнее.
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684257
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё в примере есть небольшой косячок, надо так :)

Код: c#
1.
private async Task button1_Click(object sender, EventArgs e)
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684276
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
private async Task button1_Click(object sender, EventArgs e)

почему Task - это ж эвентхендлер?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684280
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.Придется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. ((
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684281
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДядька делает неправильно, создаёт зачем-то для асинхронной операции задачу из пула, в ней после асинхронной операции выполняет сложную вычислительную операцию, думая что она также выполнится асинхронно, но очевидно будет выполняться в UI-потоке, так как для продолжения требуется контекст синхронизации, и ждёт чуда.
Наверное правильней будет сказать, что UI-поток будет ждать завершения выполнения задачи, которая будет выполняться все же в своем потоке, нет?
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684282
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

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

да, void, но всё равно async ))
давненько за десктоп не брался
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684325
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Код: c#
1.
button1.Text = await Task.Run(() => Compute(data));


Можно так:
Compute(){
.......
Action a = () => метод в гуи
}
...
Рейтинг: 0 / 0
Зачем нужен await?
    #39684334
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProПридется показать себя неучем. Почему Compute будет выполняться в UI потоке (без ConfigureAwait(false)), если мы до этого уже эвеитим задачу, в которой должен быть выполнен делегат, то есть он уже как бы начал выполняться не в потоке UI, и возврат из DownloadAsync должен быть не в поток UI, а в поток, в котором выполняется задача из пула. Или я где-то недопонял с возвратом. ((

там же await, который не блокирует поток. ContinueAwait(false) позволяет выполнить оставшуюся часть метода любым из свободных потоков, даже тем, который был использован для запуска задачи.

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


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