DOBON.NET DOBON.NETプログラミング掲示板過去ログ

非同期ダウンロードについて

環境/言語:[vista]
分類:[.NET]


画像をDownloadFileAsyncで落として終了フラグをたてたつもりなのですが
終了しません.下記プログラムをデバッグすると
Private Sub downloadClient_DownloadFileCompleted()
が一度も成立していません.
While dlf
'_DownloadFileCompletedを待つ
End While
を消すと正常終了します.While ループはDownloadFileCompleted
イベントを阻止するのでしょうか.

Public Class Form1
Dim dlf As Boolean 'download中フラグ
Dim downloadClient As System.Net.WebClient = Nothing
Dim u As Uri
Dim fileName As String = System.Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) & "\dt3.gif"
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ss As String = "http://dobon.net/banner/dt3.gif"
u = New Uri(ss)
If downloadClient Is Nothing Then
downloadClient = New System.Net.WebClient()
AddHandler downloadClient.DownloadFileCompleted, _
AddressOf downloadClient_DownloadFileCompleted
End If
dlf = True
'非同期ダウンロードを開始する
downloadClient.DownloadFileAsync(u, fileName)

While dlf
'_DownloadFileCompletedを待つ
End While

MessageBox.Show("終了")
End Sub

Private Sub downloadClient_DownloadFileCompleted(ByVal sender As Object, _
ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
dlf = False
End Sub
End Class
■No27416に返信(JKさんの記事)
> While ループはDownloadFileCompleted
> イベントを阻止するのでしょうか.
阻止というよりは、イベントでの処理から抜けないと、次のイベントが起きないと言うことでしょう。

ボタンをクリックしたり、マウスを動かしたり、キーボードで入力したりといったことで起きるイベントは同時に一つしか処理できません。(=メインスレッドと呼ばれるスレッドでしか処理されない)
今回の Button1_Click の処理中は、次の downloadClient_DownloadFileCompleted は待たされます。


ダウンロード終了を待ってから処理したいことは、downloadClient_DownloadFileCompleted に書きましょう。
今のサンプルでは MessageBox.Show を downloadClient_DownloadFileCompleted に書けば OK です。

ただし、こうすると、ダウンロード中に Button1 をもう1回押せるようになるので、ダウンロードが終わるまでには Button1 を無効にする(Button1.Enabled = False)か、モーダルダイアログを表示するかが必要になるでしょう。
ああそういうことなんですか.イベントの生起と処理を誤解してました.
単線のBasic時代は終わって,windowsでは何重ものイベントが次々に
並行処理されているようなイメージを持っていました.
すばやくて丁寧な説明ありがとうございまた.
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板