SilverlightやWindows Phoneのプログラミングを行っていると避けることができないのは非同期通信です。
非同期通信を」行うときのコード例としては次のようになります。
Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
Dim cli As New WebClient
AddHandler cli.DownloadStringCompleted, AddressOf cli_DownloadStringCompleted
cli.DownloadStringAsync(New Uri("http://blogs.msdn.com/b/shintak/rss.aspx", UriKind.Absolute))
End Sub
Private Sub cli_DownloadStringCompleted(sender As Object, e As DownloadStringCompletedEventArgs)
If e.Error IsNot Nothing Then
MessageBox.Show("エラー:" & e.Error.Message)
Else
Dim sr As New StringReader(e.Result)
Dim xr As XmlReader = XmlReader.Create(sr)
Dim sf As SyndicationFeed = SyndicationFeed.Load(xr)
Me.DataContext = sf
End If
End Sub
このコード例のようにAddHandlerで動的にイベントプロシージャを割り当てる方式であればVisual Basicの言語依存が最小になり、.NETらしいコードといえるかも知れません。
しかしVisual BasicならばもっとIDEの機能を引き出せる書き方が存在します。それがWithEventsです。
Friend WithEvents Cli As New WebClient
Private Sub MainPage_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs) Handles Me.Loaded
Cli.DownloadStringAsync(New Uri("http://blogs.msdn.com/b/shintak/rss.aspx", UriKind.Absolute))
End Sub
Private Sub Clit_DownloadStringCompleted(sender As Object,
e As System.Net.DownloadStringCompletedEventArgs) _
Handles Cli.DownloadStringCompleted
If e.Error IsNot Nothing Then
MessageBox.Show("エラー:" & e.Error.Message)
Else
Dim sr As New StringReader(e.Result)
Dim xr As XmlReader = XmlReader.Create(sr)
Dim sf As SyndicationFeed = SyndicationFeed.Load(xr)
Me.DataContext = sf
End If
End Sub
WithEventsを使って変数を宣言しておけばIDEが関連するイベントを把握しイベントプロシージャのスケルトンが簡単に生成できるのです。
Private Sub Cli_DownloadProgressChanged(sender As Object,
e As System.Net.DownloadProgressChangedEventArgs) _
Handles Cli.DownloadProgressChanged
End Sub
Private Sub Cli_DownloadStringCompleted(sender As Object,
e As System.Net.DownloadStringCompletedEventArgs) _
Handles Cli.DownloadStringCompleted
End Sub
Private Sub Cli_OpenReadCompleted(sender As Object,
e As System.Net.OpenReadCompletedEventArgs) _
Handles Cli.OpenReadCompleted
End Sub
Private Sub Cli_OpenWriteCompleted(sender As Object,
e As System.Net.OpenWriteCompletedEventArgs) _
Handles Cli.OpenWriteCompleted
End Sub
Private Sub Cli_UploadProgressChanged(sender As Object,
e As System.Net.UploadProgressChangedEventArgs) _
Handles Cli.UploadProgressChanged
End Sub
Private Sub Cli_UploadStringCompleted(sender As Object,
e As System.Net.UploadStringCompletedEventArgs) _
Handles Cli.UploadStringCompleted
End Sub
Private Sub Cli_WriteStreamClosed(sender As Object,
e As System.Net.WriteStreamClosedEventArgs) _
Handles Cli.WriteStreamClosed
End Sub
普段Visual Basicを使っていない方もぜひ実際に確認してみてください。