MessageTak jak większość programistów pierwszy test nowej technologii zaczyna się od dobrego napisu “Hello World”, tego samego szukałem w WinRT.

WinRT przemodelowało wszystko i znajome przestrzenie nazw, jak i klasy mogą już nie istnieć w WinRT.

Pisząc pierwszą aplikację w WinRT chciałem tylko wywołać prosty MessageBox z napisem “Hello World” , jak się jednak okazało klasa ta nie istnieje w WinRT.

Po kilku sekundowej panice i małej wędrówce po SDK odkryłem , że coś na wzór MessageBox istnieje pod przestrzenią nazwy Windows.UI.Popups jako klasa MessageDialog.

Napisałem wiec swoją pierwszą aplikację WinRT w ten sposób.

private void OnMessage(object sender, RoutedEventArgs e)
{
    MessageDialog dialog = new MessageDialog("Hello WinRT"); 
    dialog.ShowAsync();
} 

 

…i nic się nie stało.

Ewidentnym powodem jest słowo kluczowe Async, które powinno zostać dodane przed wykonaniem metody dialog.ShowAsync();. Jednak do czego w ogóle jest potrzebne słowo kluczowe?

image

Bez tego słowa kluczowego okno dialogowe zostało natychmiast zamknięte, zaraz, gdy zostało otwarte, tworząc iluzję bezczynności.

W WinRT każda metoda, której wykonanie zajmuje więcej niż 50 sekund musi być odwołana jako asynchroniczna operacja.

Jak każda asynchroniczna operacja posiada ona zdarzenie jej zakończenia.

To oznacza , że ta metoda zwraca operacje awaitable, która musi być jawnie rozpoczęta. Mniej więcej w ten sposób.

private void Button_Click_2(object sender, RoutedEventArgs e)
{
    MessageDialog dialog = new MessageDialog("Hello please tell me your name. - WinRT"); 
    var operation = dialog.ShowAsync(); operation.Completed 
        = new AsyncOperationCompletedHandler<IUICommand>(this.OnDialogCompleted);
} 

private void OnDialogCompleted(IAsyncOperation<IUICommand> asyncInfo, AsyncStatus asyncStatus)
{
    Debug.WriteLine("Dialog closed");
}

Ten kod wywołuje okno dialogowe.

image

Jednak, czy istnieje potrzeba pisania kodu aby wywołać proste okno dialogowe ,a potem przechwycić moment, kiedy zostało ono zamknięte. Na szczęście nie.

C# 5.0 oferuje dwa słowa kluczowe Async i Await, które znacznie upraszczają model programowanie asynchronicznego. W WinRT jest dużo operacji, które trwają dłużej niż 50 milisekund, w WinRT jest dużo operacji zależnych od czasu wykonania działania użytkownika bądź od szybkości dysku i sieci.

Pisanie asynchronicznych operacji w stylu “Event-base Asynchronous Programming” zabiłoby platformę ,a cały cel asynchroniczność też by upadł.

Warto też wspomnieć ,że ten nowy model programowania nie tworzy nowych wątków na potęgę.

Jak więc wygląda wywołanie okna MessageDialog z pomocą słów kluczowych Async i Await.

private async void Button_Click_3(object sender, RoutedEventArgs e)
{
    MessageDialog dialog = new MessageDialog("Hello please tell me your name. - WinRT"); 
    await dialog.ShowAsync(); 
    Debug.WriteLine("Dialog closed");
}

Dużo lepiej nieprawdaż. Warto zaznaczyć ,że słowo kluczowe async  tylko określa ,że gdzieś w kodzie wystąpi słowo kluczowe await.

Czy to wszystko na co stać MessageDialog? Nie oczywiście , że nie. Możesz do tego okna dodać dowolny przycisk za pomocą klasy UICommand.

private async void Button_Click_4(object sender, RoutedEventArgs e)
{
     MessageDialog dialog = new MessageDialog("Hello WinRT");
     UICommandInvokedHandler messageButtonHandler = new UICommandInvokedHandler(cmd =>
     {
                Debug.WriteLine("id:{0} label:{1}", cmd.Id, cmd.Label);
     });

     UICommand messageButton1 = new UICommand("Cmd1", messageButtonHandler, 1);
     UICommand messageButton2 = new UICommand("Cmd2", messageButtonHandler, 2);
     UICommand messageButton3 = new UICommand("Cmd3", (cmd) =>
     {
                Debug.WriteLine("Command3 done!");
     }, 3);

    dialog.Commands.Add(messageButton1);
    dialog.Commands.Add(messageButton2);
    dialog.Commands.Add(messageButton3);
    dialog.DefaultCommandIndex = 1;

    await dialog.ShowAsync();
    Debug.WriteLine("Dialog closed");
}

Każdy z przycisków może wykonać inne zadanie.

Pobierz Kod