[英]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.