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

No34957 の記事


■34957 / )  Re[4]: 複数のPageに分かれる場合のスクレ―ピング
□投稿者/ 魔界の仮面弁士 大御所(1408回)-(2021/11/15(Mon) 11:28:52)
  • アイコンNo34956に返信(Wanさんの記事)
    > Dim TmpWc = New WebClient

    WebClient は幾つかの理由により、現在は非推奨なクラスとなっています。
    https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient?view=netframework-4.8
    https://docs.microsoft.com/ja-jp/dotnet/core/compatibility/networking/6.0/webrequest-deprecated

    >> Important
    >> We don't recommend that you use the WebClient class for new development. Instead, use the System.Net.Http.HttpClient class.

    代わりに HttpClient を使えば、Task ベースの非同期実装を利用できるので、
    WhenAll を使って「全てのページが終わった後」の処理を簡単に書けます。


    取りあえず今回は WebClient で行くとして…。


    > If Not (e.[Error] IsNot Nothing) OrElse (e.Cancelled) Then
    二重否定文になっていますので、打ち消して
    「If e.Error Is Nothing OrElse e.Cancelled Then」
    と書いた方が素直だと思います。

    でも、この判定処理はそもそもおかしく無いでしょうか。もしかして、
    「If Not (e.Error IsNot Nothing OrElse e.Cancelled) Then」あるいは
    「If e.Error IsNot Nothing AndAlso Not e.Cancelled Then」と書きたかったのでは?


    > Do
    >  Application.DoEvents()
    > Loop Until WcList.All(Function(n) n.IsBusy = False)
    これだと、ループ中に再度ボタンが押されてしまうこともありそうです。

    なによりも、「イベント通知型」の非同期実装であるにもかかわらず、
    それをループ待機してしまっては台無しです。

    ループ待機で「Loop Unitil 最後のページのイベント処理が完了した時」とするのではなく、
    OpenReadCompleted イベントのハンドラーである onBinaryLoad にて、
      If 最後のページのイベント処理が完了した時 Then
        '全て完了した時に動作させたい処理
      End If
    のように実装するようにして、Button1 そのものは
    ループ待機せず、そのまま End Sub に向かって抜けてしまうようにします。


    今回の場合、OpenReadAsync 時に UserToken として 1〜16 の固有値を
    渡しているわけですから、onBinaryLoad 側では CInt(e.UserState) を通じて
    何ページ目のロードが完了したのかも分かるはずですよね。
解決み!
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -