how do you implement Async Operations in C# and MVVM?

后端 未结 3 1124
甜味超标
甜味超标 2021-02-04 14:28

hi what is the easiest way to implement asynch operations on WPF and MVVM, lets say if user if user hits enter when on a field i want to launch a command and then return back wh

3条回答
  •  情话喂你
    2021-02-04 15:07

    In Shawn Wildermuth's MSDN Article he did something like this: check out the article here: http://msdn.microsoft.com/en-us/magazine/dd458800.aspx

    and his more recent blog post here: http://wildermuth.com/2009/12/15/Architecting_Silverlight_4_with_RIA_Services_MEF_and_MVVM_-_Part_1

    public interface IGameCatalog
    {
      void GetGames();
      void GetGamesByGenre(string genre);
      void SaveChanges();
    
      event EventHandler GameLoadingComplete;
      event EventHandler GameLoadingError;
      event EventHandler GameSavingComplete;
      event EventHandler GameSavingError;
    }
    

    with an implementation like this:

    public class GameCatalog : IGameCatalog
    {
      Uri theServiceRoot;
      GamesEntities theEntities;
      const int MAX_RESULTS = 50;
    
      public GameCatalog() : this(new Uri("/Games.svc", UriKind.Relative))
      {
      }
    
      public GameCatalog(Uri serviceRoot)
      {
        theServiceRoot = serviceRoot;
      }
    
      public event EventHandler GameLoadingComplete;
      public event EventHandler GameLoadingError;
      public event EventHandler GameSavingComplete;
      public event EventHandler GameSavingError;
    
      public void GetGames()
      {
        // Get all the games ordered by release date
        var qry = (from g in Entities.Games
                   orderby g.ReleaseDate descending
                   select g).Take(MAX_RESULTS) as DataServiceQuery;
    
        ExecuteGameQuery(qry);
      }
    
      public void GetGamesByGenre(string genre)
      {
        // Get all the games ordered by release date
        var qry = (from g in Entities.Games
                   where g.Genre.ToLower() == genre.ToLower()
                   orderby g.ReleaseDate
                   select g).Take(MAX_RESULTS) as DataServiceQuery;
    
        ExecuteGameQuery(qry);
      }
    
      public void SaveChanges()
      {
        // Save Not Yet Implemented
        throw new NotImplementedException();
      }
    
      // Call the query asynchronously and add the results to the collection
      void ExecuteGameQuery(DataServiceQuery qry)
      {
        // Execute the query
        qry.BeginExecute(new AsyncCallback(a =>
        {
          try
          {
            IEnumerable results = qry.EndExecute(a);
    
            if (GameLoadingComplete != null)
            {
              GameLoadingComplete(this, new GameLoadingEventArgs(results));
            }
          }
          catch (Exception ex)
          {
            if (GameLoadingError != null)
            {
              GameLoadingError(this, new GameCatalogErrorEventArgs(ex));
            }
          }
    
        }), null);
      }
    
      GamesEntities Entities
      {
        get
        {
          if (theEntities == null)
          {
            theEntities = new GamesEntities(theServiceRoot);
          }
          return theEntities;
        }
      }
    }
    

提交回复
热议问题