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:

  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.

 

解答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

 

 

 

转载于:https://www.cnblogs.com/chucklu/p/10364112.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值