我正在创建一个带有共享核心的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
?
答案 0 :(得分:4)
错误说明了一切。具有等待代码的方法也应该是异步的。
public async void ConnectAsync()
{
conn = new ConstantConnection ();
await conn.Connect ();
}
答案 1 :(得分:3)
正如其他人所指出的那样,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
等等。
答案 2 :(得分:1)
等待async
方法只能在async
方法中完成。因此,您必须创建async
方法,然后await
Connect()
:
public async void SomeAsync()
{
await conn.Connect();
}
否则,如果要在同步方法中运行该代码(没有async
关键字),则应调用Wait
以等待该方法完成:
conn.Connect().Wait();
答案 3 :(得分:1)
我同意Stephen的观点,async void被称为“Fire and Forget”,它会给你的代码带来很多问题。
始终使用:
public async Task<"Type"> Example()
{
}
或在“无效”情况下使用:
public async Task Example()
{
}
所有MVP都推荐这个......