Task.Fromresult() Method In C#

In C#, the .NET framework provides developers with the Task Parallel Library (TPL), which includes a function known as Task.FromResult. This function empowers developers to generate a task that is already completed and yields a specific result. Particularly useful in scenarios involving a mix of synchronous and asynchronous code for asynchronous programming, this method is invaluable when there's a requirement to synchronously return a finished task.

Task.FromResult is predominantly utilized to generate a task that signifies an asynchronous operation that has been completed already with a specified result.

It is crucial to note that Task.FromResult does not provide the benefits of asynchronous processing, therefore it is not recommended for tasks that are CPU-bound or may block threads. Testers commonly employ Task.FromResult to simulate asynchronous actions without the need for the additional complexities of asynchronous tasks.

Syntax:

It has the following syntax:

Example

Task.FromResult<TResult>(TResult result);
  • The kind of result we need to wrap up with the finished task is called a TResult .
  • The value we need to assign to the task's outcome is called the result.
  • Example:

Let's consider an example to demonstrate the Task.FromResult method in C#.

Example

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        int value = 123;
        	
        // Create a completed task with the value 123
 Task<int> completedTask = Task.FromResult(value);        
        // Retrieve the result synchronously
        int result = await completedTask;
        
        Console.WriteLine("Result: " + result);
    }
}

Output:

Output

Result: 123

Example Code:

Let's consider another example to demonstrate the Task.FromResult method within C#.

Example

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // Example 1: Creating a completed task with an integer result
        int value = 42;
        
        // Create a completed task with the value 42
        Task<int> completedTask = Task.FromResult(value);
        
        // Retrieve the result synchronously
        int result = await completedTask;
        
        Console.WriteLine("Example 1 Result: " + result);

        // Example 2: Creating a completed task with a string result
        string message = "Hello, world!";
        
        // Create a completed task with the string message
        Task<string> completedTaskString = Task.FromResult(message);
        
        // Retrieve the result synchronously
        string resultString = await completedTaskString;
        
        Console.WriteLine("Example 2 Result: " + resultString);
    }
}

Output:

Output

Example 1 Result: 42
Example 2 Result: Hello, world!
  • In the first scenario, the Task class is employed in Example 1 to generate a finished task yielding an integer outcome (42) by calling the fromResult method.
  • In the second instance, the Task object is utilized in Example 2 to produce a finished task yielding a string output ("Hello, world!") through the fromResult method.
  • Example 2:

Let's consider a different scenario to demonstrate the Task.FromResult functionality in C#.

Example

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        // result: Simulating an asynchronous operation to retrieve user data
        string userId = "10567482";
        
        // Simulate fetching user data asynchronously
        UserData userData = await GetUserAsync(userId);
        
        // Print user data
        Console.WriteLine("Result: User ID: " + userData.UserId + ", Username: " + userData.Username);
    }

    static async Task<UserData> GetUserAsync(string userId)
    {
        // Simulating a delay before fetching user data
        await Task.Delay(1000);
        
        // Simulate fetching user data from a database or external service
        UserData user = GetUserFromDatabase(userId);
        
        // Return the user data as a completed task
        return Task.FromResult(user).Result;
    }

    static UserData GetUserFromDatabase(string userId)
    {
        // Simulate retrieving user data from a database
        // In a real scenario, this method would query a database or an external service
        // Here, we're just returning a hardcoded user for demonstration purposes
        return new UserData
        {
            UserId = userId,
            Username = "Harsha"
        };
    }
}

class UserData
{
    public string UserId { get; set; }
    public string Username { get; set; }
}

Output:

Output

Result: User ID: 10567482, Username: Harsha

Explanation:

  • In this example, the result shows how to simulate an asynchronous operation to use FromResult to retrieve user data.
  • The GetUserAsync method uses Task to simulate an asynchronous operation by delaying by one second.Delay, followed by a synchronous user data fetch using GetUserFromDatabase .
  • In this case, GetUserFromDatabase merely returns a hardcoded user for demonstration; otherwise, it resembles fetching user data from a database or an external service.
  • Next, using Task, the user data that was obtained from GetUserFromDatabase is wrapped around a finished task.fromResult and provided an asynchronous return.
  • Conclusion:

When you need to generate completed tasks with specified results, the Task.FromResult method in C# proves to be a straightforward and efficient choice. This method excels at bridging the gap between synchronous and asynchronous code seamlessly, making it particularly valuable in situations where a blend of these two programming paradigms is necessary. Task.FromResult serves as a way to mimic asynchronous operations with predetermined outcomes, which can be advantageous when dealing with cached or pre-calculated data or during the testing phase of code due to its adaptable and uncomplicated syntax. However, it is important to use Task.FromResult judiciously, as it can diminish the benefits of asynchronous programming if applied to time-consuming or blocking processes. Task.FromResult emerges as a beneficial tool in the .NET framework for fostering clear and concise code architecture.

Input Required

This code uses input(). Please provide values below: