web-dev-qa-db-fra.com

Que dois-je faire pour rendre mes méthodes attendables?

Comment puis-je lancer mes propres méthodes attendues asynchrones?

Je vois que l'écriture d'une méthode asynchrone est facile comme tarte dans certains cas:

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

... mais malheureusement, nous voyons aussi que n'importe quelle méthode ne peut pas être faite comme bon gré mal gré; à savoir: cela ne fonctionne pas:

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

... cela m'arrête avec l'erreur de compilation, "Ne peut pas attendre int"; un indice au moment de la conception me dit de la même manière, "le type 'int' n'est pas attendu"

J'ai également essayé cela avec les mêmes résultats:

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

Que dois-je faire pour rendre mes méthodes attendables?

MISE À JOUR

Comme Linebacker et S. Cleary l'ont indiqué (toute relation avec ce chat qui était sur KNBR?), Cela fonctionne:

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

... c'est-à-dire qu'il compile - mais il ne "bouge" jamais.

Au moment de l'exécution, il me dit que je dois "attendre" l'appel à TestAsyncAwait (), mais si je le fais, il ne se compile pas du tout ...

43
B. Clay Shannon

Vous avez seulement besoin pour renvoyer un fichier attendu. Task/Task<TResult> est un choix courant; Tasks peuvent être créés à l'aide de Task.Run (pour exécuter du code sur un thread d'arrière-plan) ou TaskCompletionSource<T> (pour encapsuler un événement asynchrone).

Lisez le Modèle asynchrone basé sur les tâches pour plus d'informations.

26
Stephen Cleary

Votre méthode

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

devrait être écrit comme ceci

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

Si vous devez renvoyer l'int, remplacez le type de tâche:

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

Plus d'explication ici .

17
Jeson Martajaya
var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;
2
p3n

Vous devez soit consommer le retour attendu, soit retourner 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);
    }
    
1
Mayank