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?
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 ...
Vous avez seulement besoin pour renvoyer un fichier attendu. Task
/Task<TResult>
est un choix courant; Task
s 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.
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 .
var something = Task<int>.Factory.StartNew(() => 0);
something.Wait();
int number = something.Result;
Vous devez soit consommer le retour attendu, soit retourner Task<Type of await call>
private async Task<Geoposition> TestGeo()
{
Geolocator geo = new Geolocator();
return await geo.GetGeopositionAsync();
}
private async Task<int> TestAsyncAwait()
{
return await TaSLs_Classes.TASLsUtils.GetZoomSettingForDistance(5);
}