无法等待异步方法
Cannot await on async method
我正在创建一个具有共享核心的 Xamarin 应用程序。在共享核心中,我有一个用于套接字通信的连接 class:
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
}
}
现在我有另一个 class,像构造函数一样工作,它想通过执行来使用上述 class 的对象:
conn = new ConstantConnection();
await conn.Connect();
这让我在 Xamarin Studio 中出现错误,其中显示:
The 'await' operator can only be used within an async method
据我所知 Connect
是 async
。为什么我不能使用 await
?
错误说明了一切。有等待代码的方法也应该是异步的。
public async void ConnectAsync()
{
conn = new ConstantConnection ();
await conn.Connect ();
}
等待 async
方法只能在 async
方法中完成。所以你要创建一个async
方法,然后await
Connect()
:
public async void SomeAsync()
{
await conn.Connect();
}
否则,如果您想 运行 同步方法中的代码(没有 async
关键字),您应该调用 Wait
以等待该方法已完成:
conn.Connect().Wait();
正如其他人所指出的,await
只能在 async
方法中使用。但是,您应该不使用async void
!
由于您的调用代码是一个构造函数,您将不得不重新考虑您的方法。我描述了一个variety of approaches on my blog,其中我更喜欢异步工厂方法:
private MyConstructor()
{
conn = new ConstantConnection();
}
public async Task<MyConstructor> CreateAsync()
{
var result = new MyConstructor();
await result.Connect();
}
附带说明一下,您的任务返回方法应该使用 Async
后缀命名,以跟在 TAP guidelines 之后。例如,Connect
应该是 ConnectAsync
,等等
我同意 Stephen 的观点,async void 被称为 "Fire and Forget",它会给您的代码带来很多问题。
始终使用:
public async Task<"Type"> Example()
{
}
或在"void"情况下使用:
public async Task Example()
{
}
所有 MVP 都推荐这个...
我正在创建一个具有共享核心的 Xamarin 应用程序。在共享核心中,我有一个用于套接字通信的连接 class:
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
}
}
现在我有另一个 class,像构造函数一样工作,它想通过执行来使用上述 class 的对象:
conn = new ConstantConnection();
await conn.Connect();
这让我在 Xamarin Studio 中出现错误,其中显示:
The 'await' operator can only be used within an async method
据我所知 Connect
是 async
。为什么我不能使用 await
?
错误说明了一切。有等待代码的方法也应该是异步的。
public async void ConnectAsync()
{
conn = new ConstantConnection ();
await conn.Connect ();
}
等待 async
方法只能在 async
方法中完成。所以你要创建一个async
方法,然后await
Connect()
:
public async void SomeAsync()
{
await conn.Connect();
}
否则,如果您想 运行 同步方法中的代码(没有 async
关键字),您应该调用 Wait
以等待该方法已完成:
conn.Connect().Wait();
正如其他人所指出的,await
只能在 async
方法中使用。但是,您应该不使用async void
!
由于您的调用代码是一个构造函数,您将不得不重新考虑您的方法。我描述了一个variety of approaches on my blog,其中我更喜欢异步工厂方法:
private MyConstructor()
{
conn = new ConstantConnection();
}
public async Task<MyConstructor> CreateAsync()
{
var result = new MyConstructor();
await result.Connect();
}
附带说明一下,您的任务返回方法应该使用 Async
后缀命名,以跟在 TAP guidelines 之后。例如,Connect
应该是 ConnectAsync
,等等
我同意 Stephen 的观点,async void 被称为 "Fire and Forget",它会给您的代码带来很多问题。
始终使用:
public async Task<"Type"> Example()
{
}
或在"void"情况下使用:
public async Task Example()
{
}
所有 MVP 都推荐这个...