簡體   English   中英

異步等待返回任務

[英]async await return Task

有人可以解釋這對同步方法意味着什么嗎? 如果我嘗試將方法更改為async那么 VS 會抱怨它。

這有效:

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

這不起作用:

public async Task MethodName()
{
     return Task.FromResult<object>(null);
}

所以基本上我想知道這到底是什么意思: Task.FromResult<object>(null);

async方法與普通方法不同。 您從async方法返回的任何內容都包含在Task

如果你沒有返回 value(void) 它將被包裹在Task ,如果你返回int它將被包裹在Task<int>等等。

如果您的異步方法需要返回int您可以將該方法的返回類型標記為Task<int>並且您將返回純int而不是Task<int> 編譯器將為您將int轉換為Task<int>

private async Task<int> MethodName()
{
    await SomethingAsync();
    return 42;//Note we return int not Task<int> and that compiles
}

同樣,當您返回Task<object>您的方法的返回類型應為Task<Task<object>>

public async Task<Task<object>> MethodName()
{
     return Task.FromResult<object>(null);//This will compile
}

由於您的方法正在返回Task ,因此它不應返回任何值。 否則它不會編譯。

public async Task MethodName()
{
     return;//This should work but return is redundant and also method is useless.
}

請記住,沒有await語句的 async 方法不是async

使用 async 時需要使用 await 關鍵字,並且您的函數返回類型應該是通用的這是一個帶有返回值的示例:

public async Task<object> MethodName()
{
    return await Task.FromResult<object>(null);
}

這是一個沒有返回值的示例:

public async Task MethodName()
{
    await Task.CompletedTask;
}

閱讀這些:

TPL:http : //msdn.microsoft.com/en-us/library/dd460717( v=vs.110).aspx和任務: http : //msdn.microsoft.com/en-us/library/system.threading .tasks(v=vs.110).aspx

異步: http : //msdn.microsoft.com/en-us/library/hh156513.aspx等待: http : //msdn.microsoft.com/en-us/library/hh156528.aspx

添加 async 關鍵字只是簡化狀態機創建的語法糖。 本質上,編譯器會接收您的代碼;

public async Task MethodName()
{
     return null;
}

並將其變成;

public Task MethodName()
{
     return Task.FromResult<object>(null);
}

如果您的代碼有任何await關鍵字,則編譯器必須采用您的方法並將其轉換為一個類來表示執行它所需的狀態機。 在每個await關鍵字處,變量的狀態和堆棧都將保存在類的字段中,該類會將自己作為完成掛鈎添加到您正在等待的任務中,然后返回。

當該任務完成時,您的任務將再次執行。 所以一些額外的代碼被添加到方法的頂部,以恢復變量的狀態並跳轉到代碼的下一塊。

請參閱async 和 await 生成什么? 一個血腥的例子。

這個過程與編譯器使用 yield 語句處理迭代器方法的方式有很多共同之處。

這是一個返回 String 類型任務的任務(C# 匿名函數或換句話說,使用了“Func”委托)

    public static async Task<string> MyTask()
    {
        //C# anonymous AsyncTask
        return await Task.FromResult<string>(((Func<string>)(() =>
        {
            // your code here
            return  "string result here";

        }))());
    }

為了從異步方法中獲得正確的響應,您需要在調用這些任務方法時放置 await。 這將等待將其轉換回返回值類型而不是任務類型。

例如 var content = await StringAsyncTask (

where public async Task< String > StringAsyncTask())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM