WPF, Silverlight, Silverlight for Windows Phone und Metro Style Apps

Silverlight 5 Async API unter Silverlight 5
Kommentare

In der neuen Kolumne „XAML Expertise“ des Windows Developer präsentiert Gregor Biswanger Top-How-tos zum Thema XAML. Einsteiger und fortgeschrittene XAML-Experten sollen hier durch geballtes Wissen gesättigt werden. Heute gibt es folgende Expertise: „Async API unter Silverlight 5“.

Windows Developer

Dieser Teil der Serie „XAML Expertise“ von Gregor Biswanger ist erstmalig erschienen im Windows Developer 9.2012

Ab dem .NET Framework 4.5 wurde C# 5.0 mit dem neuen Async-Feature erweitert. Auch unter WinRT spielt dieses API eine große Rolle. Das Feature ermöglicht asynchrone Methoden so aufzurufen, als würden diese synchron verarbeitet werden. Ein asynchroner Aufruf wird somit verschleiert. Normal wurde dieses Feature nicht unter Silverlight 5 erweitert und steht somit auch nur für den leichtgewichtigen Proxy WebClient zur Verfügung. Außerdem kann das Feature nur unter Visual Studio 2012 verwendet werden, indem mittels NuGet zusätzlich das AsyncTargetingPack installiert wird (Abb. 1).

Abb.1. Das AsyncTargetingPack über NuGet beziehen
Abb.1. Das AsyncTargetingPack über NuGet beziehen

Damit nun das neue Feature verwendet werden kann, sind ein paar Regeln zu beachten: Die Methode, die innerhalb einen asynchronen Aufruf tätigt, muss das neue async-Schlüsselwort enthalten. Dann erkennt man eine von Async unterstützte Methode daran, dass sie Task als Rückgabetyp gibt. Diese ruft man wie gewohnt auf, bis auf eine zusätzliche Deklaration vom Schlüsselwort await. Den Sourcecode zum Aufruf finden Sie in Listing 1.

Listing 1: Async-API mittels WebClient verwenden

private async void Button_Click(object sender, RoutedEventArgs e) 
{
  WebClient proxy = new WebClient();
  string result = await proxy.DownloadStringTaskAsync("http://localhost:24634/SayHelloService.svc/");
  
  tbResult.Text = XElement.Parse(result).Value;
}  

Um das Feature auch auf den generierten Proxy verwenden zu können, muss man sich selbst eine passende Fassade dazu schreiben. Die Implementierung dazu steht in Listing 2 und 3.

Listing 2: Generierten Proxy um Facade-Proxy erweitern, um das neue Async-Feature verwenden zu können

public class SayHelloServiceClientProxy
{
  public statis Task GetMessage()
  {
    var taskCompletionSource = new TaskCompletionSource();
    
    SayHelloServiceClient proxy = new SayHelloServiceClient();
    proxy.SayHelloCompleted += (s, e) =>
    {
      if(e.Error != null)
        taskCompletionSource.TrySetException(e.Error);
      else if(e.Cancelled)
        taskCompletionSource.TrySetCanceled();
      else
        taskCompletionSource.TrySetResult(e.Result);
    }
    
    proxy.SayHelloAsync();
    
    return taskCompletionSource.Task;
  }
}  
Listing 3: Zugriff auf das Facade-Proxy

public async void Button_Click(object sender, RoutedEventArgs e)
{
  tbResult.Text = await SayHelloServiceClientProxy.GetMessageAsync();
}  
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -