无法等待异步方法

时间:2015-03-06 08:31:26

标签: c# asynchronous xamarin async-await

我正在创建一个带有共享核心的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'运算符只能在异步方法中使用

就我所见,Connectasync。为什么我不能使用await

4 个答案:

答案 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都推荐这个......