Я бы хотел использовать 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 способ сделать это?