Create a completed Task
My preferred method for doing this is to call Task.WhenAll()
with no arguments. The MSDN documentation states that "If the supplied array/enumerable contains no tasks, the returned task will immediately transition to a RanToCompletion state before it's returned to the caller.". That sounds like what you want.
Update: I found the source over at Microsoft's Reference Source; there you can see that Task.WhenAll contains the following:
return (tasks.Length == 0) ? // take shortcut if there are no tasks upon which to wait
Task.CompletedTask :
new WhenAllPromise(tasks);
So Task.CompletedTask is indeed internal, but it is exposed by calling WhenAll() with no arguments.
The newest version of .Net (v4.6) is adding just that, a built-in Task.CompletedTask:
Task completedTask = Task.CompletedTask;
That property is implemented as a no-lock singleton so you would almost always be using the same completed task.
Task<T>
is implicitly convertable to Task
, so just get a completed Task<T>
(with any T
and any value) and use that. You can use something like this to hide the fact that an actual result is there, somewhere.
private static Task completedTask = Task.FromResult(false);
public static Task CompletedTask()
{
return completedTask;
}
Note that since we aren't exposing the result, and the task is always completed, we can cache a single task and reuse it.
If you're using .NET 4.0 and don't have FromResult
then you can create your own using TaskCompletionSource
:
public static Task<T> FromResult<T>(T value)
{
var tcs = new TaskCompletionSource<T>();
tcs.SetResult(value);
return tcs.Task;
}