Task作为返回值以及Task<TResult>作为返回值
async await return Task
Can somebody explain what does this means into a synchronous method? If I try to change the method to async
then VS complain about it.
This works:
public Task MethodName()
{
return Task.FromResult<object>(null);
}
This doesn't work:
public async Task MethodName()
{
return Task.FromResult<object>(null);
}
So basically I would like to know what exactly this means: Task.FromResult<object>(null);
解答1
async
methods are different than normal methods. Whatever you return from async
methods are wrapped in a Task
.
If you return no value(void) it will be wrapped in Task
, If you return int
it will be wrapped in Task<int>
and so on.
If your async method needs to return int
you'd mark the return type of the method as Task<int>
and you'll return plain int
not the Task<int>
. Compiler will convert the int
to Task<int>
for you.
private async Task<int> MethodName()
{
await SomethingAsync();
return 42;//Note we return int not Task<int> and that compiles
}
Sameway, When you return Task<object>
your method's return type should be Task<Task<object>>
public async Task<Task<object>> MethodName()
{
return Task.FromResult<object>(null);//This will compile
}
Since your method is returning Task
, it shouldn't return any value. Otherwise it won't compile.
public async Task MethodName()
{
return;//This should work but return is redundant and also method is useless.
}
Keep in mind that async method without an await
statement is not async
.
解答2
You need to use the await keyword when use async and your function return type should be generic Here is an example with return value:
public async Task<object> MethodName()
{
return await Task.FromResult<object>(null);
}
Here is an example with no return value:
public async Task MethodName()
{
await Task.CompletedTask;
}
Read these:
TPL: http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx and Tasks: http://msdn.microsoft.com/en-us/library/system.threading.tasks(v=vs.110).aspx
Async: http://msdn.microsoft.com/en-us/library/hh156513.aspx Await: http://msdn.microsoft.com/en-us/library/hh156528.aspx
What is the use for Task.FromResult<TResult> in C#
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.
解答1
There are two common use cases I've found:
- When you're implementing an interface that allows asynchronous callers, but your implementation is synchronous.
- When you're stubbing/mocking asynchronous code for testing.
解答2
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