Mon application Xamarin.Forms a plusieurs interfaces (pour Dependency
s) avec des implémentations pour Android et iOS. Les méthodes qu'ils contiennent ne sont pas asynchrones. Maintenant, je veux ajouter les implémentations pour ces interfaces pour UWP, mais plusieurs des méthodes nécessaires sont asynchrones de sorte qu'elles ne correspondent pas aux signatures. Comment puis-je faire face à cela? Est la seule solution pour créer une interface séparée pour UWP?Comment faire face à UWP async lorsque Android et iOS ne sont pas asynchrones?
Répondre
Dans ces scénarios, je tendance à utiliser la méthode Task.FromResult pour les implémentations non-async. Exemple: vous avez une méthode sur Windows qui retourne une Task de type bool et vous voulez implémenter la même fonctionnalité sur Android et iOS pour les méthodes qui retournent bool.
public interface ISample
{
public Task<bool> GetABool();
}
Sous Windows vous suffit de retourner le Groupe
public class WindowsSample : ISample
{
public Task<bool> GetABool()
{
// whatever implementation
return SomeTaskOfTypeBool();
}
}
sur Android ou iOS vous enveloppait la valeur dans une tâche
public class AndroidSample : ISample
{
public Task<bool> GetABool()
{
// replace with however you get the value.
var ret = true;
return Task.FromResult(ret);
}
}
C'est une bonne idée. Au lieu d'essayer de synchroniser l'async, async async la synchronisation. Si vous ne pouvez pas les battre, rejoignez-les. :) – ispiro
Chaque fois que je vois quelqu'un appeler .Result sur une tâche, un petit morceau de moi meurt. –
Vous ne pouvez pas utiliser le mot-clé await. Vous devez créer une nouvelle tâche et attendre la fin de la tâche. Une interface séparée n'est pas nécessaire. La gestion des exceptions avec les tâches peut être difficile, informez-vous.
Appel d'une méthode async Method1 avec la valeur de retour:
string s = Task.Run(() => Method1()).Result;
Sans valeur de retour:
Task.Run(() => Method1()).Wait;
.Rest ou bloc .wait jusqu'à ce que la tâche est terminée.
Plus de détails: Calling async methods from non-async code
Vous venez d'ouvrir un sac de deadlocks. – Bart
vous pouvez afficher le code pour votre interface? Difficile d'offrir des suggestions lorsqu'il n'y a pas de code. –
Quelque chose comme 'chaîne Method1();' qui devrait être dans UWP: 'Tâche Method1();'. –
ispiro
Pouvez-vous faire une interface asynchrone pour les 3 plates-formes? –