Che cosa devo fare per fare i miei metodi awaitable?

Come posso roll mia async awaitable metodi?

Vedo che la scrittura di un metodo asincrono è facile come torta in alcuni casi:

private async Task TestGeo()
{
    Geolocator geo = new Geolocator();
    Geoposition pos = await geo.GetGeopositionAsync();
    double dLat = pos.Coordinate.Latitude;
    double dLong = pos.Coordinate.Latitude;
}

…ma purtroppo anche vedere che non solo qualsiasi metodo può essere fatto async volenti o nolenti, anche se, vale a dire: questo non funziona:

private async Task TestAsyncAwait()
{
    int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}

…non mi ferma con l’errore di compilazione, “Non attendono int”; un accenno in fase di progettazione, allo stesso modo mi dice, “type ‘int’ non è awaitable”

Ho anche provato con gli stessi risultati:

    Task<int> i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);

Che cosa devo fare per fare i miei metodi awaitable?

AGGIORNAMENTO

Come Linebacker e S. Cleary indicato (in relazione a quel gatto che ha usato per essere su KNBR?), questo funziona:

int i = await Task.Run(() => TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5));

…che dire, è compila — ma non è mai “muove”.

In fase di runtime, mi dice che devo “in attesa della” CHIAMATA a TestAsyncAwait(), ma se lo faccio, non compilare…

  • int i = await Task.Run(() => TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5));
  • Vi consiglio di leggere TOCCARE
  • Così Lambda non sono solo di rigore, ma un obbligo ora? Ho visto, almeno fino ad ora, come intelligente-trucchi intelligenti.
  • Sei sicuro di voler fare questo awaitable?
  • No, sto solo sperimentando – vorrei sapere come fare metodi awaitable in modo che io possa “fare fino a quando le mucche tornano a casa” o “senza nemmeno pensare (molto) su di esso” quando ne ho bisogno.

 

4 Replies
  1. 26

    È solo bisogno per restituire un awaitable. Task/Task<TResult> è una scelta comune; Tasks può essere creato utilizzando Task.Run (esecuzione di codice in un thread in background) o TaskCompletionSource<T> (per avvolgere un evento asincrono).

    Leggere il Task-Based Modello Asincrono per ulteriori informazioni.

  2. 17

    Tuo metodo

    private async Task TestAsyncAwait()
    {
        int i = await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
    }

    dovrebbe essere scritto come questo

    private async Task TestAsyncAwait()
    {
        Task<int> t = new Task<int>(() =>
        {
            return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
        });
        t.Start();
        await t;
    }

    Se avete bisogno di restituire un int, sostituire il tipo di Attività:

    private async Task<int> TestAsyncAwait()
    {
        Task<int> t = new Task<int>(() =>
        {
            return TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
        });
        t.Start();
        return await t;
    }

    Spiegazione più qui.

  3. 2
    var something = Task<int>.Factory.StartNew(() => 0);
    something.Wait();
    int number = something.Result;
    • Downvoted perché l’OP sta chiaramente cercando di fare questo in modo asincrono
    • Grazie per aaronburro per l’aggiunta di un downvote spiegazione. Questo è troppo raro.
  4. 1

    È necessario consumare l’atteso ritorno o di ritorno Task<Type of await call>

    1. private async Task<Geoposition> TestGeo()
      {
          Geolocator geo = new Geolocator();
          return await geo.GetGeopositionAsync();
      }
    2. private async Task<int> TestAsyncAwait()
      {
          return await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
      }
    • La domanda è su #2, e per il #2, l’errore dice “Tipo ‘int’ non è awaitable”

Lascia un commento