无法等待异步方法

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

据我所知 Connectasync。为什么我不能使用 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 都推荐这个...