首页 > 解决方案 > 可以在没有大量堆分配的情况下使用 C# async/await 吗?

问题描述

我想在高帧率很重要并且应该避免垃圾收集停止的游戏引擎的上下文中使用 async/await。惯用的 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#unity3d

解决方案


推荐阅读