IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

Async Await Task Constructeur ViewModel


Sujet :

Framework .NET

  1. #1
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 436
    Points : 963
    Points
    963
    Par défaut Async Await Task Constructeur ViewModel
    Bonjour à vous,

    Je travaille actuellement sur un projet Xamarin.Forms (la chance hein ^^). Ayant travaillé majoritairement sur des projets Silverlight datant d'avant la sortie de Async Await et des Tasks.
    Du coup je n'ai pas eu la chance de découvrir toutes les subtilités. Du coup, je compte sur vous pour m'aider :)

    Je développe avec le patern MVVM. J'ai une classe BaseViewModel. Cette méthode contient une méthode abstraite nommée OnViewAndComponentsLoaded.
    Dans chacune de mes vues, je surcharge la méthode OnAppearing qui est déclenché au chargement de l'UI (équivalent de Loaded).
    Dans cette méthode, je peux être amené à faire 1 ou n appels webservice. Et c'est là que je sens mon implémentation foireuse (je me permet on est entre nous).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    /// <summary>
    /// ViewModel de base : implémente INotifyPropertyChanged et possède une propriété pour gérer le verrouillage de l'application.
    /// </summary>
    public abstract class BaseViewModel : INotifyPropertyChanged
    {
    	#region - INotifyPropertyChanged -
    	public event PropertyChangedEventHandler PropertyChanged;
    	public void RaisePropertyChanged(string propertyName)
    	{
    		if (PropertyChanged != null)
    		{
    			PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    		}
    	}
    	#endregion
     
    	private bool _IsLoading;
    	/// <summary>
    	/// Permet de savoir si l'application est verrouiller pour attendre un retour web service.
    	/// Fait appel à : ServicesContainer.Instance.UserInterfaceService.Verrouillage().
    	/// </summary>
    	public bool IsLoading
    	{
    		get { return _IsLoading; }
    		set
    		{
    			_IsLoading = value;
    			ServicesContainer.Instance.UserInterfaceService.Verrouillage(_IsLoading);
    		}
    	}
     
    	/// <summary>
    	/// Méthode appelée par chaque view une fois affichée.
    	/// </summary>
    	public abstract void OnViewAndComponentsLoaded();
    }

    Exemple d'une vue, une fois affichée, elle va demander au viewmodel de s'initialiser.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public partial class ActualitesPage
    {
    	public ActualitesPage(ConnectionDataModel connectionData)
    	{
    		InitializeComponent();
    		this.BindingContext = new ActualitesViewModel(connectionData);
    	}
     
    	protected override void OnAppearing()
    	{
    		base.OnAppearing();
    		(this.BindingContext as BaseClass.BaseViewModel).OnViewAndComponentsLoaded();
    	}
    }
    Et un exemple de viewmodel héritant de ma classe de base et qui surcharge la méthode OnViewAndComponentsLoaded.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class ActualitesViewModel : BaseViewModel
    {
    	public ActualitesViewModel() {	}
     
    	public override async void OnViewAndComponentsLoaded()
    	{
    		this.IsLoading = true;
    		string resultat = await RequestHelper.PostAsync("https://sitewebpouravoirdonnees/mobile/listeactualites", new NameValueCollection() {
    			{ "session", this._ConnectionData.NumSession },
    			{ "numeroPage",  "1" },
    			{ "nbPerPage", "5"}
    		});
    		if (!string.IsNullOrEmpty(resultat))
    		{
    			var liste = ServicesContainer.Instance.SerialisationService.DeserializeCollection<ResumeActualiteModel>(resultat);
    			this.Actualites = new ObservableCollection<ResumeActualiteModel>();
    			liste.ForEach((item) => { this.Actualites.Add(item); });
    		}
    		this.IsLoading = false;
    	}
     
    	private ObservableCollection<ResumeActualiteModel> _Actualites;
    	public ObservableCollection<ResumeActualiteModel> Actualites
    	{
    		get { return _Actualites; }
    		set { _Actualites = value; RaisePropertyChanged("Actualites"); }
    	}
    }
    Le helper post que j'utilise dans le viewmodel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class RequestHelper
    {
    	public static string Post(string uri, NameValueCollection pairs)
    	{
    		byte[] response = null;
    		using (WebClient client = new WebClient())
    		{
    			response = client.UploadValues(uri, pairs);
    		}
    		return System.Text.Encoding.UTF8.GetString(response);
    	}
     
    	public static Task<string> PostAsyncTask(string uri, NameValueCollection pairs)
    	{
    		return Task.Run<string>(() => Post(uri, pairs));
    	}
     
    	public async static Task<string> PostAsync(string uri, NameValueCollection pairs)
    	{
    		byte[] response = null;
    		using (WebClient client = new WebClient())
    		{
    			response = await client.UploadValuesTaskAsync(uri, pairs);
    		}
    		return System.Text.Encoding.UTF8.GetString(response);
    	}
     
    }
    Pas de chance, ça ne semble pas fonctionner :( pourtant je rentre bien dans l'ajout de ligne. Précision : si le code dans la méthode est placé dans le constructeur, que je fais l'appel de façon synchrone, ma liste est bien chargée et l'UI est bien notifiée.
    Sinon, peut être qu'en utilisant une autre façon de faire (utiliser la méthode PostAsync qui retourne une Task et changer ma méthode OnViewAndComponentsLoaded en fonction qui retourne une task.
    Mais alors comment faire si jamais je n'ai pas d'appel webservice à faire mais setter des valeurs, gérer des événements ou peu importe mais sans traitement awaitable.

    Je ne sais pas si c'est clair, donc n'hésitez pas à me demander d'éclaircir certains points. Je vous remercie pour votre lecture.
    Bonne journée à vous tous !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2015
    Messages : 15
    Points : 34
    Points
    34
    Par défaut
    Je vois cette question fort intéressante, mais je me rend compte que le post est très vieux.

    ça vaut encore le coup de répondre ou pas ?

Discussions similaires

  1. Réponses: 11
    Dernier message: 21/05/2014, 09h41
  2. WP 7 et 8 : utiliser les mots clefs await/async et Task<T>
    Par rolandl dans le forum Windows Phone
    Réponses: 2
    Dernier message: 27/03/2013, 09h40
  3. [C#] Différence Async, Await, MultiThreading
    Par same66 dans le forum Débuter
    Réponses: 2
    Dernier message: 14/03/2013, 09h25
  4. Réponses: 2
    Dernier message: 13/03/2013, 19h16
  5. Async/Await avec Silverlight & WCF
    Par Joffrey Kern dans le forum Silverlight
    Réponses: 5
    Dernier message: 24/05/2012, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo