zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    回顾C#3.0新特性(3)
    第五周作业
    第六周基础作业
    第三周syh
    基础作业
    第七周作业
    2019年春季学期第四周作业
    第八周作业
    .Net 反射
    C#中SqlParameter
  • 原文地址:https://www.cnblogs.com/chucklu/p/10364112.html
Copyright © 2011-2022 走看看