Using C#'s `Task.FromResult()` Method for Creating Completed Tasks

Learn how to efficiently create completed tasks in C#'s Task Parallel Library (TPL) using `Task.FromResult()`. This tutorial explains its usage in representing synchronous operations asynchronously, its application in simplifying asynchronous code, and its benefits in testing scenarios.



Using C#'s `Task.FromResult()` Method

In C#'s Task Parallel Library (TPL), `Task.FromResult()` creates a task that's already completed with a specified result. This is particularly useful when you need to represent a synchronous operation as an asynchronous one, often in scenarios where you're working with existing synchronous code or in testing.

Understanding `Task.FromResult()`

`Task.FromResult()` is designed to create a `Task` object that's already in the completed state and holds a specific value. It's essentially a shortcut for creating a task without actually performing any asynchronous operation.

Important Considerations

  • Avoid using `Task.FromResult()` for CPU-bound operations as it won't provide any performance benefits from asynchronous execution. It's best suited for cases where you have a pre-computed result.
  • This is frequently used in unit testing to mock asynchronous behavior without needing to run actual asynchronous code.

`Task.FromResult()` Syntax


Task<TResult> Task.FromResult(TResult result);

The `TResult` is the type of the result you want to wrap in a completed task.

Examples

Example 1: Simple Integer Result


int value = 123;
Task<int> task = Task.FromResult(value);
int result = await task; // result will be 123

Example 2: String Result


string message = "Hello!";
Task<string> task = Task.FromResult(message);
string result = await task; // result will be "Hello!"

Example 3: Simulating an Asynchronous Operation


// ... (GetUserAsync and GetUserFromDatabase methods) ...