【问题标题】:Cannot await on async method无法等待异步方法
【发布时间】:2017-08-17 00:28:16
【问题描述】:

我正在创建一个具有共享核心的 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

【问题讨论】:

  • 你调用它的方法怎么样?那是异步的吗?
  • 在构造函数中调用这个函数??如果是,构造函数不能是异步的。
  • @user2941906 是的,我做到了!我按照 Patrick Hofman 的描述添加了 Wait() 来修复它

标签: c# asynchronous xamarin async-await


【解决方案1】:

错误说明了一切。有等待代码的方法也应该是异步的。

public async void ConnectAsync()
{
    conn = new ConstantConnection ();
    await conn.Connect ();
}

【讨论】:

    【解决方案2】:

    正如其他人指出的那样,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,等等。

    【讨论】:

      【解决方案3】:

      等待async 方法只能在async 方法中完成。所以你要创建一个async方法,然后awaitConnect()

      public async void SomeAsync()
      {
          await conn.Connect();
      }
      

      否则,如果您想在同步方法中运行该代码(没有async 关键字),您应该调用Wait 以等待该方法完成:

      conn.Connect().Wait();
      

      【讨论】:

        【解决方案4】:

        我同意 Stephen 的观点,async void 被称为“一劳永逸”,它会给你的代码带来很多问题。

        始终使用:

        public async Task<"Type"> Example()
        { 
        }
        

        或在“无效”情况下使用:

         public async Task Example()
         {
         }
        

        所有 MVP 都推荐这个...

        【讨论】:

          猜你喜欢
          • 2013-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多