2016-11-17 1 views
0

Je travaille dans l'application Windows Mobile et suis la structure MVVM.Comment créer une propriété getter & Setter async dans C#?

J'ai une méthode où j'ai lié "lst_activity" qui est un objet de collection Observable.

et cette liste est return dans la méthode get.

Mais le problème est lorsque j'appelle "List_ActivityType()" cette fonction n'est pas attendre la réponse.

Comment faire getter & propriété Setter Async C#?

Y at-il une alternative pour le même?

ObservableCollection<Activity_Type> lst_activity = new ObservableCollection<Activity_Type>(); 

public ObservableCollection<Activity_Type> Get_ActivityTypeData 
      { 
       get 
       { 
        await List_ActivityType(); 
        return lst_activity; 
       } 
      } 

      public async Task List_ActivityType() 
      { 
       try 
       { 

        if (NetworkInterface.GetIsNetworkAvailable() == true) 
        { 
         IsolatedStorageSettings setting = IsolatedStorageSettings.ApplicationSettings; 
         if (setting.Contains("UserLogin_Code")) 
         { 
          string user_code = Convert.ToString(setting["UserLogin_Code"]); 
          if (!string.IsNullOrEmpty(user_code)) 
          { 
           ShowProgressBar(); 
           string str = ServiceURI.Get_Activity; 
           Uri geturi = new Uri(string.Format(str)); 
           System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); 
           HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, geturi); 
           var response1 = await CommandClass.GetResponse<SilverHrms.Data.JsonPraserClasses.Activity_Type_RootObject>(request); 
           lst_activity.clear(); 
           if (response1 != null && response1.Flag == true) 
           { 
            for (int i = 0; i < response1.lstListComboData.Count; i++) 
            { 
             if (i == 0) 
             { 
              lst_activity.Add(new Activity_Type 
              { 
               Text = "--Select--", 
               Value = "" 
              }); 
             } 
             lst_activity.Add(response1.lstListComboData.ElementAt(i)); 
            } 
           } 
           else 
           { 
            //Show_msg("Error", response1.Message); 
           } 
           CloseProgressBar(); 
          } 
         } 
         else 
         { 
          App.RootFrame.Navigate(new Uri(PageNavigationURI.Login, UriKind.RelativeOrAbsolute)); 
         } 
        } 
        else 
        { 
         if (!App.OnOff) 
         { 
          CloseProgressBar(); 
          CommandClass.NetworkErrorMsg(); 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
       } 
      } 
+1

Voir cette question: http://stackoverflow.com/questions/6602244/how-to-call-an-async-method-from-a -getter-or-setter – Ofir

+6

Vous ne devriez pas avoir une telle logique complexe dans getter/seter. Envisagez de créer une méthode async qui remplit les données et les exécute. dans le chargement de la page. – pwas

+1

Lisez la réponse de ** Stephen Cleary **: [comment-appeler-une-méthode asynchrone-à partir d'un getter-or-setter] (http://stackoverflow.com/questions/6602244/how- pour-appeler-une-méthode-asynchrone-d'-un-getter-or-setter) – mybirthname

Répondre

-1

Au lieu de cela attendent, peut-être que vous pouvez utiliser Dispatcher.BeginIvoke (() => {List_ActivityType()}); La file d'attente du répartiteur est essentiellement votre processus.

+0

Ça ne fonctionne pas. –

+0

Problème principal est ma propriété (get propriété) est lier avant d'obtenir la réponse et avant de remplir l'objet de collection de liste. C'est pourquoi l'erreur a été soulevée. –

-1

Peut-être que vous pourriez faire quelque chose comme ceci:

public ObservableCollection<Activity_Type> Get_ActivityTypeData 
{ 
    get 
    { 
     return Task.Run(() => List_ActivityType()).Result; 
    } 
} 

public async Task<ObservableCollection<Activity_Type>> List_ActivityType() 
{ 
    //All your code goes here 

    //Finally return the lst_activity 
    return lst_activity; 
}