What is the use for Task.FromResult<TResult> in C#

C#.NetTask Parallel-LibraryTaskAsync Await

C# Problem Overview


In C# and TPL (Task Parallel Library), the Task class represents an ongoing work that produces a value of type T.

I'd like to know what is the need for the Task.FromResult method ?

That is: In a scenario where you already have the produced value at hand, what is the need to wrap it back into a Task?

The only thing that comes to mind is that it's used as some adapter for other methods accepting a Task instance.

C# Solutions


Solution 1 - C#

There are two common use cases I've found:

  1. When you're implementing an interface that allows asynchronous callers, but your implementation is synchronous.
  2. When you're stubbing/mocking asynchronous code for testing.

Solution 2 - C#

One example would be a method that makes use of a cache. If the result is already computed, you can return a completed task with the value (using Task.FromResult). If it is not, then you go ahead and return a task representing ongoing work.

Cache Example: Cache Example using Task.FromResult for Pre-computed values

Solution 3 - C#

Use it when you want to create an awaitable method without using the async keyword. I found this example:

public class TextResult : IHttpActionResult
{
	string _value;
	HttpRequestMessage _request;

	public TextResult(string value, HttpRequestMessage request)
	{
		_value = value;
		_request = request;
	}
	public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
	{
		var response = new HttpResponseMessage()
		{
			Content = new StringContent(_value),
			RequestMessage = _request
		};
		return Task.FromResult(response);
	}
}

Here you are creating your own implementation of the IHttpActionResult interface to be used in a Web Api Action. The ExecuteAsync method is expected to be asynchronous but you don't have to use the async keyword to make it asynchronous and awaitable. Since you already have the result and don't need to await anything it's better to use Task.FromResult.

Solution 4 - C#

From MSDN:

> This method is useful when you perform an asynchronous operation that returns a Task object, and the result of that Task object is already computed.

http://msdn.microsoft.com/en-us/library/hh228607.aspx

Solution 5 - C#

Use the Task.FromResult when you want to have a asynchronous operation but sometimes the result is in hand synchronously. You can find a good sample here http://msdn.microsoft.com/en-us/library/hh228607.aspx.

Solution 6 - C#

I would argue that you could use Task.FromResult for methods that are synchronous that take a long time to complete while you can do other independent work in your code. Id rather make those methods to call async though. But imagine the situation where you have no control over the code called and you want that implicit parallel processing.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionlysergic-acidView Question on Stackoverflow
Solution 1 - C#Stephen ClearyView Answer on Stackoverflow
Solution 2 - C#Matt SmithView Answer on Stackoverflow
Solution 3 - C#EdminssonView Answer on Stackoverflow
Solution 4 - C#goughy000View Answer on Stackoverflow
Solution 5 - C#AlborzView Answer on Stackoverflow
Solution 6 - C#VikingView Answer on Stackoverflow