2017-06-18 3 views
2

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?

+0

vous pouvez afficher le code pour votre interface? Difficile d'offrir des suggestions lorsqu'il n'y a pas de code. –

+0

Quelque chose comme 'chaîne Method1();' qui devrait être dans UWP: 'Tâche Method1();'. – ispiro

+0

Pouvez-vous faire une interface asynchrone pour les 3 plates-formes? –

Répondre

1

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); 
    } 
} 
+1

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

+0

Chaque fois que je vois quelqu'un appeler .Result sur une tâche, un petit morceau de moi meurt. –

0

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

+1

Vous venez d'ouvrir un sac de deadlocks. – Bart