Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: async await что я делаю не так?  [new]
winsky!
Member

Откуда: Київ
Сообщений: 5143
fkthat,

нет, я тебе предлагаю не возводить ничего в абсолют.
и не ломать неокрепших умов.
5 май 21, 15:12    [22318834]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
winsky!
Member

Откуда: Київ
Сообщений: 5143
fkthat,

ну и если очень хочется официальной доки

автор
You should not use ConfigureAwait when you have code after the await in the method that needs the context. For GUI apps, this includes any code that manipulates GUI elements, writes data-bound properties or depends on a GUI-specific type such as Dispatcher/CoreDispatcher. For ASP.NET apps, this includes any code that uses HttpContext.Current or builds an ASP.NET response, including return statements in controller actions. Figure 7demonstrates one common pattern in GUI apps—having an async event handler disable its control at the beginning of the method, perform some awaits and then re-enable its control at the end of the handler; the event handler can’t give up its context because it needs to re-enable its control.


правда, твое "всегда" уже не всегда?
5 май 21, 15:18    [22318839]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
автор
You should not use ConfigureAwait when you have code after the await in the method that needs the context.

Удивишься, но это эквивалентно вызову ConfigureAwait(true) потому что оно по-дефолту.
5 май 21, 15:29    [22318848]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
winsky!
правда, твое "всегда" уже не всегда?

Можешь его не писать, лично тебе я разрешаю.
5 май 21, 15:30    [22318851]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
winsky!
Member

Откуда: Київ
Сообщений: 5143
fkthat,

ага. ну я понял. и ты тоже.
5 май 21, 15:32    [22318853]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
winsky!
Member

Откуда: Київ
Сообщений: 5143
автор
Можешь его не писать, лично тебе я разрешаю.

я-то как раз пишу. где надо. где не надо - не пишу.
5 май 21, 15:38    [22318859]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
hVostt
Member

Откуда:
Сообщений: 19318
fkthat
hVostt
Честно говоря, не понимаю, почему эта фича не входит в коробку, я имею в виду глобальная настройка на уровне сборки.

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


Примерно так это и работает, сначала компилируется, потом Fody вносит изменения прям в сборку, добавляя везде ConfigureAwait()
5 май 21, 15:59    [22318870]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
winsky!
я-то как раз пишу. где надо. где не надо - не пишу.

Забей, я же тебе дал карт-бланш писать как хочешь. Будут проблемы, например, с ревью - скажи, что я уже одобрил.

Сообщение было отредактировано: 5 май 21, 16:15
5 май 21, 16:22    [22318887]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
iskatelsql
Member

Откуда:
Сообщений: 867
fkthat
Ты лезешь куда надо, только не с той стороны.

Ну ЗБС теперь, его заблочили до того, как он мне объяснил с какой стороны лезть.

Разблочьте плиз, пусть по теме то ответит, раз среди вас желающих нет...

Сообщение было отредактировано: 6 май 21, 01:11
6 май 21, 01:17    [22319071]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
fkthat
Member

Откуда:
Сообщений: 4880
iskatelsql,

Смотри. Забудь на время о потоках вообще. Нет их. (Имхо, кстати, чем до этого больше дела имел с "обычной" многопоточностью, тем сложнее может быть воткнуть в TPL). Есть только асинхронные методы/вызовы - это любые методы, которые возвращают объект Task. Task - это нечто, что рано или поздно перейдет либо в состояние "завершено успешно" либо "завершено с ошибкой". Единственный правильный способ отследить завершение таска это вызвать для него ContinueWith - он типа как цепляет на таск "обработчик события" для его (таска) завершения. И сам он в свою очередь возвращает таск, который означает "я завершусь когда завершится первый таск, а потом выполнится обработчик. Вот. Теперь, если писать достаточно сложный код таким образом (с ContinueWith) то получится громоздкая конструкция и цепочек этих ContinueWith и коллбеков, которые им передаются. Поэтому придумали конструкцию async/await, с которой все упрощается - если взять код наподобии такого:

async Task FooAsync()
{
    await BarAsync();
    await BazAsync();
    await BlaAsync();
}


то, на самом деле, (отвлекаясь от мудреных деталей) компилятор просто превратит его во что-то схожее с:

Task FooAsync()
{
    return BarAsync()
       .ContinueWith(() => BazAsync())
       .ContinueWith(() => BlaAsync());


Т.е. он просто вернет объект таск "завершусь тогда, когда завершится таск из BarAsync(), потом завершится таск из BazAsync(), а после этого завершится таск из BlaAsync()". Вот и все. Ты на самом деле никогда ничего не "ждешь завершения", а манипулируешь тасками цепляя явно или неявно на них коллбеки ContinueWith. Ну и есть еще готовые нужные утилиты для работы с тасками, например Task.WhenAll - таск который завершится сразу когда завершатся все переданные в него таски, или Task.WhenAny - завершится когда завершится хоть один из тасков, и еще другие - можешь посмотреть доки по TPL.
12 май 21, 21:32    [22321217]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4206
fkthat,

так то, таск не обязан завершаться и может не завершаться вообще, но всё равно + в карму, что время не пожалел и всё расписал :)
12 май 21, 21:39    [22321220]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
iskatelsql
Member

Откуда:
Сообщений: 867
fkthat,

У меня как раз проблема с тем, что таск порождает таск..., "каин породил авеля а авель.." и так далее. Как это безобразие прекратить то? Они на вызове требуют опять asinc. В одном из ответов предлагалось даже переделать майн в асинк static async Task Main(string[] args). Есть у этой цепочки какой-то стопор?
22 май 21, 02:30    [22325610]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6192
iskatelsql
fkthat,

У меня как раз проблема с тем, что таск порождает таск..., "каин породил авеля а авель.." и так далее. Как это безобразие прекратить то? Они на вызове требуют опять asinc. В одном из ответов предлагалось даже переделать майн в асинк static async Task Main(string[] args). Есть у этой цепочки какой-то стопор?

Нет, нету. Один из евангелистов async-await (Клири вроде как) уже сравнивал это с зомби-вирусом - если в одном месте кода это завелось, то оно неудержимо расползается по всему коду.
22 май 21, 07:28    [22325618]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
fkfka
Member

Откуда:
Сообщений: 131
iskatelsql
Есть у этой цепочки какой-то стопор?

А какая необходимость в этом самом "стопоре"? Зачем тебе вообще "ждать" таск - просто чтобы "ждать"? Ты делаешь просто Main асинхронным и возвращаешь из него некий "таск всех тасков" - а все остальное за тебя сделает фреймворк.

Сообщение было отредактировано: 22 май 21, 11:09
22 май 21, 11:16    [22325640]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
fkfka
Member

Откуда:
Сообщений: 131
Roman Mejtes
таск не обязан завершаться и может не завершаться вообще

Теоретически, это вполне может быть (например, если в нем тот же самый бесконечный цикл), но это все-таки не очень хороший таск, потому что он в итоге будет грубовато пришиблен при завершении приложения - по-хорошему для такого должна быть предусмотрена его "мягкая" остановка через CancellationToken.
22 май 21, 13:39    [22325673]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
iskatelsql
Member

Откуда:
Сообщений: 867
fkthat
Имхо, кстати, чем до этого больше дела имел с "обычной" многопоточностью, тем сложнее может быть воткнуть в TPL)


Вот тут Вы абсолютно правы!. Кидаю на форму кнопку, по ней запускаю поток, который живет своей жизнью и периодически опрашивает девайсы, кидая результаты на форму и в лог.

Ума не приложу как завести такое тасками без потоков. Во всех примерах асинхронная операция это что-то временное - например запись на диск.

fkfka
А какая необходимость в этом самом "стопоре"


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

ЗЫ. теперь совсем запутался.
23 май 21, 02:13    [22325793]     Ответить | Цитировать Сообщить модератору
 Re: async await что я делаю не так?  [new]
fkfka
Member

Откуда:
Сообщений: 131
iskatelsql
Я не понимаю как асинхронность запустить постоянно, думаю в цикле...


Вот так, что ли?

public async Task LoopAsync()
{
    for(var i = 0; i < 100500; i++)
    {
        await DoSomethingAsync(i);
    }
}

public async Task DoSomethingAsync(int i)
{
    await Console.Out.WriteLineAsync($"Hello from #{i}");
}
23 май 21, 11:04    [22325825]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / WinForms, .Net Framework Ответить