Pull to refresh

Comments 9

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

Я так понял, что сам факт наличия аллокаций.

Ну т.е. бывают иногда прокси методы, которые выглядят типа:

public async Task<T> Do()

{

await impl.Do();

}

И вот их можно переписать как

public Task<T> Do()

{

return impl.Do();

}

Убрав аллокацию =)

Так не получается, даже две строки:
await Task.Delay(delay);
_fileContent = await File.ReadAllTextAsync("file1");

чистой оберткой не являются.

Придется подождать ответа автора...


UFO just landed and posted this here
UFO just landed and posted this here

Да, именно поэтому и еще по ряду причин David Fowler в своем AsyncGuidance не рекомендует делать такие прокси. Поэтому, ответ использовать их или нет
зависит от того, что важнее - корректный стек вызовов плюс другие плюшки, либо мизерный выигрыш от экономии аллокации в куче.

Я думаю в коде машины состояний после рефакторинга перед catch пропущено DelayAwaiter.GetResult();что важно для правильного завершения работы метода

                    Builder.AwaitUnsafeOnCompleted(ref DelayAwaiter, ref this);
                    break;
            }
           DelayAwaiter.GetResult();
        }
        catch (Exception exception)
        {
            CurrentState = State.Finished;
            Builder.SetException(exception);
        }

Да, вы, конечно, правы! Все-таки этот кусочек логики ChatGPT упустил при рефакторинге, а я недоглядел при ревью. Исправил, спасибо вам за внимательность.

В Бонусе: похоже на то что при переходе по ко второму состоянию в свиче он попробует залочить obj ещё раз и тут будет висеть (нечно похожее на deadlock) поэтому и запрещено)

Sign up to leave a comment.