Search code examples
c#asynchronoustask-parallel-libraryvaluetask

What is the ValueTask equivalent of Task.CompletedTask?


I am implementing IAsyncDisposable which requires me to return a ValueTask, but sometimes my dispose method has nothing to do. How should I return in this case?

At the moment I'm returning new ValueTask(Task.CompletedTask) which seems to work but since the point of valueTasks is to avoid creating unnecessary heap objects, I'm sure there should be a simpler and more efficient way.


Solution

  • All structs have a default constructor. The default constructor of ValueTask creates a completed ValueTask:

    var completedValueTask = new ValueTask();
    

    Or alternatively:

    ValueTask completedValueTask = default;
    

    Update: The official documentation has been updated with the following note:

    An instance created with the parameterless constructor or by the default(ValueTask) syntax (a zero-initialized structure) represents a synchronously, successfully completed operation.