在没有大量堆分配的情况下可以使用C#异步/等待吗?

时间:2020-03-10 01:23:45

标签: c# unity3d

我想在游戏引擎的环境中使用异步/等待,在这种情况下,高帧率非常重要,应避免垃圾收集暂停。惯用的异步/等待似乎严重依赖堆分配。我该如何减少呢?

Task<T>s在堆上分配,等待似乎导致分配,并且通过CancellationToken.ThrowIfCancellationRequested取消任务会生成较大的堆栈跟踪。实际上,it appears不能在没有分配异常和堆栈跟踪的情况下取消任务。

我可以像这样实现任务取消,但是不使用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...

}

是否有更惯用的方式做到这一点?

0 个答案:

没有答案