[英]Cannot await on async method
我正在創建具有共享核心的Xamarin應用程序。 在共享核心中,我有一個用於套接字通信的連接類:
public class ConstantConnection {
public async Task Connect()
{
await conn.Connect (); // Calls a socket plugin to connect
timer = new Timer (new Action<object> (ParseData), "", 100, 1, false); // starts a local timer
}
public async Task Disconnect()
{
timer.Dispose (); // End timer
await conn.Disconnect (); // Close socket
}
}
現在,我有另一個類,就像構造函數一樣,希望通過執行以下類來使用上述類的對象:
conn = new ConstantConnection();
await conn.Connect();
這使我在Xamarin Studio中出現錯誤,提示:
'await'運算符只能在異步方法中使用
據我所知, Connect
是async
。 為什么我不能使用await
?
錯誤說明了一切。 具有等待代碼的方法也應該是異步的。
public async void ConnectAsync()
{
conn = new ConstantConnection ();
await conn.Connect ();
}
正如其他人指出的那樣, await
只能在async
方法中使用。 但是,你不應該使用async void
!
由於調用代碼是構造函數,因此您必須重新考慮您的方法。 我在博客上描述了多種方法 ,其中我更喜歡異步工廠方法:
private MyConstructor()
{
conn = new ConstantConnection();
}
public async Task<MyConstructor> CreateAsync()
{
var result = new MyConstructor();
await result.Connect();
}
附帶說明一下,您的任務返回方法應使用Async
后綴命名,以遵循TAP准則 。 例如, Connect
應該是ConnectAsync
,等等。
等待async
方法只能在async
方法中完成。 因此,您必須創建一個async
方法,然后await
Connect()
:
public async void SomeAsync()
{
await conn.Connect();
}
否則,如果要在同步方法(沒有async
關鍵字的一種)中運行該代碼,則應調用Wait
以等待該方法完成:
conn.Connect().Wait();
我同意Stephen的觀點,異步void被稱為“ Fire and Forget”,它會給您的代碼帶來很多問題。
始終使用:
public async Task<"Type"> Example()
{
}
或在“無效”情況下使用:
public async Task Example()
{
}
所有MVP都推薦這個...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.