2013-02-16 3 views
3

Je suis très confus au sujet de la nouvelle substance async. J'ai une bibliothèque portable implémentant mon modèle avec quelques classes avec des fonctions virtuelles que j'espère utiliser dans ASP .NET, WPF, Windows Store, Silverlight 5 et Windows Phone 8. Elles pourraient cibler la fonctionnalité WCF, CSharp SQLite, ou être remplacées dans la plate-forme bibliothèques spécifiques aux fichiers locaux.programmation Async bibliothèque portable

Comment puis-je le configurer maintenant que la programmation synchrone est désapprouvée dans le monde Windows Store? J'ai essayé d'ajouter des mots-clés asynchrones et ainsi de suite dans la bibliothèque portable pour les fonctions virtuelles, mais cela dit que je n'ai pas les cadres nécessaires. Comment puis-je réutiliser cette bibliothèque sans la réécrire? La programmation OOP est-elle totalement morte maintenant?

+0

Quelle est la programmation OOB? Est-ce la version d'OOP d'un homme pauvre? –

+0

Quoi qu'il en soit, la nouvelle méthode asynchrone ne change rien; Vous pouvez toujours utiliser votre bibliothèque telle quelle, en particulier si aucun des appels ne dure plus de 50 ms. C'est la métrique de Microsoft, et seulement 10% de tous les appels dans leur cadre rencontrent cette métrique et sont donc écrits pour être asynchrones. Les 90% restants sont encore de bonnes méthodes synchrones ordinaires. –

+0

Désolé, je voulais dire OOP. Le cerveau est assez frit après 15 heures de programmation. – jtsoftware

Répondre

0

La façon dont je m'adresse est d'utiliser une classe d'aide que j'ai adaptée à partir d'une version précédente. En gros:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 
using Windows.UI.Core; 
using Windows.UI.Xaml; 

namespace JTModelsWinStore.Local 
{ 
    public delegate void UseDataDelegate(DataCoordinator data); 
    public delegate bool GetDataDelegate(DataCoordinator data); 

    public class DataCoordinator 
    { 
     public DependencyObject Consumer; 
     public GetDataDelegate GetDataFunction; 
     public UseDataDelegate UseDataFunction; 
     public bool GetDataSucceeded; 
     public Exception ErrorException; 
     public string ErrorMessage; 

     public DataCoordinator(
      DependencyObject consumer, 
      GetDataDelegate getDataFunction, 
      UseDataDelegate useDataFunction) 
     { 
      Consumer = consumer; 
      GetDataFunction = getDataFunction; 
      UseDataFunction = useDataFunction; 
      GetDataSucceeded = false; 
      ErrorException = null; 
      ErrorMessage = null; 
     } 

     public Task GetDataAsync() 
     { 
      GetDataSucceeded = false; 

      Task task = Task.Factory.StartNew(() => 
      { 
       if (GetDataFunction != null) 
       { 
        try 
        { 
         GetDataSucceeded = GetDataFunction(this); 
        } 
        catch (Exception exception) 
        { 
         GetDataSucceeded = false; 
         ErrorException = exception; 
         ErrorMessage = exception.Message; 
        } 
       } 

       if (UseDataFunction != null) 
       { 
        if (Consumer != null) 
        { 
         var ignored = Consumer.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
         { 
          UseDataFunction(this); 
         }); 
        } 
        else 
         UseDataFunction(this); 
       } 
      }); 
      return task; 
     } 
    } 
} 

puis dans le code de Windows Store:

private async void ItemView_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    DataCoordinator data = new DataCoordinator(this, Logon, LogonCompleted); 
    await data.GetDataAsync(); 
} 

private bool Logon(DataCoordinator data) 
{ 
    LoggedOnUserID = ServiceClient.LogOn(UserName, Password); 

    if (LoggedOnUserID == null) 
    { 
     UserName = "AnonymousUser"; 
     Password = ""; 

     if (!String.IsNullOrEmpty(ServiceClient.ErrorMessage)) 
      data.ErrorMessage = "Log on failed."; 

     return false; 
    } 

    if (!String.IsNullOrEmpty(ServiceClient.ErrorMessage)) 
    { 
     data.ErrorMessage = ServiceClient.ErrorMessage; 
     return false; 
    } 

    return true; 
} 

private void LogonCompleted(DataCoordinator data) 
{ 
    if (data.GetDataSucceeded && LoggedOnUserID != null) 
     pageTitle.Text = "Logged On"; 
    else 
     pageTitle.Text = "LogOn Failed"; 
} 

Je fournis l'aide de deux fonctions, l'une pour obtenir les données (lent), et un pour faire quelque chose avec les données l'interface utilisateur. Je sais que je pourrais le faire dans deux lambdas imbriqués, mais j'aime cacher les deux lambdas, ce qui est plus confortable pour un ancien comme moi.

N'hésitez pas à le critiquer, pour le bénéfice des autres comme pour le mien.

2

VS acceptera heureusement async dans les bibliothèques portables ciblant .NET 4.5 et Windows Store. Si vous avez besoin d'autres plates-formes (notamment .NET 4.0 et Silverlight 5), vous devez installer Microsoft.Bcl.Async.

Si vous avez besoin d'une référence, le source for my AsyncEx library est disponible; l'assembly principal est une bibliothèque portable qui dépend de Microsoft.Bcl.Async.

Questions connexes