簡體   English   中英

無法等待異步方法

[英]Cannot await on async method

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

錯誤說明了一切。 具有等待代碼的方法也應該是異步的。

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

正如其他人指出的那樣, await只能在async方法中使用。 但是,你應該使用async void

由於調用代碼是構造函數,因此您必須重新考慮您的方法。 在博客上描述了多種方法 ,其中我更喜歡異步工廠方法:

private MyConstructor()
{
  conn = new ConstantConnection();
}

public async Task<MyConstructor> CreateAsync()
{
  var result = new MyConstructor();
  await result.Connect();
}

附帶說明一下,您的任務返回方法應使用Async后綴命名,以遵循TAP准則 例如, Connect應該是ConnectAsync ,等等。

等待async方法只能在async方法中完成。 因此,您必須創建一個async方法,然后await Connect()

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

否則,如果要在同步方法(沒有async關鍵字的一種)中運行該代碼,則應調用Wait以等待該方法完成:

conn.Connect().Wait();

我同意Stephen的觀點,異步void被稱為“ Fire and Forget”,它會給您的代碼帶來很多問題。

始終使用:

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

或在“無效”情況下使用:

 public async Task Example()
 {
 }

所有MVP都推薦這個...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM