2017-09-20 5 views
0

J'ai une commande qui exécute une méthode async:formes Xamarin, Execute commande asyncronously

public ICommand LoadDataCommand => _loadDataCommand ?? 
             (_loadDataCommand = new Command<bool>(async force => await LoadData(force))); 
private virtual async Task LoadData(bool forceLoad) 
    { 
     if(forceLoad) 
     Data = await _service.LoadData(); 
    } 

maintenant à l'intérieur d'une vue que je veux exécuter async LoadDataCommand faire quelque chose sur ViewModel objet de données (je ne devrais pas appeler LoadData() méthode directement dans ma vue)

Répondre

-1

Utilisez une autre méthode qui appelle votre méthode asynchrone. N'oubliez pas d'ajouter .Result sur la méthode d'appel à la fin. J'aime:

public string LoadDataCaller(bool forceLoad) 
    { 
      respStr = LoadData(forceLoad).Result; // *** Add ".Result" Important 

     return respStr; 
    } 

    private virtual async Task LoadData(bool forceLoad) 
{ 
    if(forceLoad) 
    Data = await _service.LoadData(); 
} 
+0

L'appel '.Result' sur une tâche asynchrone bloquera le thread en attendant que la tâche se termine. Au lieu de cela, vous devriez appeler le 'LoadData' normalement et faire d'autres actions basées sur le résultat après la tâche attendue. c'est à dire. lorsque 'Data' est défini. – Laffen

-1

Je pense que c'est ce que vous cherchez. Pour ICommand asynchrone, vous devez utiliser les événements après la fin de la commande ICommand asynchrone. Si vous avez besoin d'async dans ICommand, vous pouvez le faire:

public override ICommand ContinuarCommand 
{ 
    get { 
     return new Command(async() =>{ //Your async code }); 
    } 
} 
+0

Je sais comment l'appeler en mode de synchronisation, je suis à la recherche de mode asynchrone – AlirezaXX

+0

Vous pouvez utiliser asyn dans Icommand comme ceci. 'override publique ICommand ContinuarCommand { get { return new Commande (async() => {}); } } ' mais la seule façon d'appeler ICommand de manière asynchrone y utilise un événement ou un jeton. avant et après. – katxalot