Можно ли использовать C# async / await без большого выделения кучи? - PullRequest
2 голосов
/ 10 марта 2020

Я бы хотел использовать async / await в контексте игрового движка, где важна высокая частота кадров и следует избегать остановок сборки мусора. Idiomati c async / await, похоже, сильно зависит от выделения кучи. Как я могу уменьшить это?

Task<T>s выделение в куче, ожидание, кажется, вызывает выделения, а отмена задачи через CancellationToken.ThrowIfCancellationRequested создает большую трассировку стека. На самом деле, кажется , что нет способа отменить задачу без выделения исключения и трассировки стека.

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

public async Task<T> Method<T>(CancellationToken cancellationToken)
{
    // Do not do this as it could cause a TaskCanceledException
    //await Task.Delay(1000, cancellationToken);  

    await Task.Delay(1000);
    if (cancellationToken.IsCancellationRequested)
    {
        //perhaps return null to show a cancellation?
        return default;
    }

    //uncancelled work...

}

Есть ли более идиоматический c способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...