メッセージダイアログとポップアップメニュー (1/5)
作成:2014-02-01 11:40
更新:2014-02-01 11:40
更新:2014-02-01 11:40
■非同期処理とawait/sync
前回、MessageDialogというクラスを使ってメッセージを画面に表示させました。MessageDialogインスタンスを作成し、ShowAsyncというメソッドを使ってメッセージダイアログを表示しました。
あれはあれで、まぁ一応動くのでいいんですが、実はあまり一般的でない書き方をしています。ShowAsyncは、非同期のメソッドです。すなわち、処理の実行が終わるのを待ってから次の処理に進む、というのではなくて、「命令を実行したら、(処理が完了してなくても)とっとと次に進んでしまう」というものです。
ShowAsyncの場合、メッセージダイアログを画面に表示しますが、表示された時にはもうプログラムの処理はその先を実行してしまっています。表示されたダイアログは、一人取り残されてるんです。ですから、例えば「ダイアログを閉じたらこうしよう」というようなことを考えていてもできません。これはちょっと困りますね。
こうした場合、非同期メソッドに対し「終わるまで特別に待っててよ」と命令することができます。これは、冒頭に「await」というものをつけて記述します。例えば、ShowAsyncならこんな具合です。
前回、作成したShowAsyncによるメッセージ表示の処理を、書きなおしたものを下に挙げておきましょう。MessageDialogなどでは、このようにawaitを使った書き方をするほうが多いでしょう。
つまり、同期処理にするのではなく、「非同期なんだけど、うまいこと処理が終わるまで待つようにしてる」ものなんですね。
あれはあれで、まぁ一応動くのでいいんですが、実はあまり一般的でない書き方をしています。ShowAsyncは、非同期のメソッドです。すなわち、処理の実行が終わるのを待ってから次の処理に進む、というのではなくて、「命令を実行したら、(処理が完了してなくても)とっとと次に進んでしまう」というものです。
ShowAsyncの場合、メッセージダイアログを画面に表示しますが、表示された時にはもうプログラムの処理はその先を実行してしまっています。表示されたダイアログは、一人取り残されてるんです。ですから、例えば「ダイアログを閉じたらこうしよう」というようなことを考えていてもできません。これはちょっと困りますね。
こうした場合、非同期メソッドに対し「終わるまで特別に待っててよ」と命令することができます。これは、冒頭に「await」というものをつけて記述します。例えば、ShowAsyncならこんな具合です。
await dlog.ShowAsync();
また、非同期処理を実行するメソッドでも「async」という修飾子を付けておきます。例えばこんな具合です。private async void button1_click(object sender, RoutedEventArgs e)asyncは、その中にawaitの非同期処理があることを示します。非同期メソッドを実行する場合、「事項した結果をもらって処理したいな」というときには、このように「メソッドにasyncをつけ、非同期メソッドの前にawaitをつける」というのが基本と考えてください。
前回、作成したShowAsyncによるメッセージ表示の処理を、書きなおしたものを下に挙げておきましょう。MessageDialogなどでは、このようにawaitを使った書き方をするほうが多いでしょう。
■async/awaitの意味
このasyncとawaitがユニークな点は、「待っている間、他の処理の邪魔をしない」という点です。「awaitすると、その処理が終わる待て待って次に進む」のですが、普通の同期処理だと待っている間はすべての処理が停止してしまいます。が、awaitの場合、このawaitしているメソッド(下のサンプルコードならbutton1_clickメソッド)は停止していますが、それ以外の処理はすべて正常に動いています。GUIも普通に操作できますし、別スレッドでプログラムが動いているような場合にはそれらも停止せず動き続けます。つまり、同期処理にするのではなく、「非同期なんだけど、うまいこと処理が終わるまで待つようにしてる」ものなんですね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using System.Threading.Tasks; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Popups; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; namespace MyWin8App { public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } private async void button1_click(object sender, RoutedEventArgs e) { string msg = "Hello, " + textbox1.Text + "!"; MessageDialog dlog = new MessageDialog(msg,"Hello"); await dlog.ShowAsync(); } } }
※関連コンテンツ