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

BackGroundWorkerでエラーが出る場合

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

処理が重くなってきたので、BackGroundで動かそうと思い、初めてBackGroundWorkerを使ってみました。

ただコードをBackGroundWorkerに書き、BackGroundWorker.RunWorkerAsync()で動かすだけで簡単だなと思いやってみると、下記の部分でエラーが出てしまいます。


WebBrowserを設置して、自動でログインしようとしているだけなのですが・・・

出来る事と出来ない事があるのでしょうか?



WebBrowser1.Document.All.GetElementsByName("email")(0).InnerText = id
WebBrowser1.Document.All.GetElementsByName("password")(0).InnerText = pass


あと、リロード待ちもエラーが出てしまいます。



With WebBrowser1

Do Until .ReadyState = WebBrowserReadyState.Complete
Application.DoEvents()
Loop
End With
2010/12/10(Fri) 05:14:06 編集(投稿者)

■No27808に返信(ザナドゥさんの記事)
> 処理が重くなってきたので、BackGroundで動かそうと思い、初めてBackGroundWorkerを使ってみました。
BackGroundWorker ではなく、
BackgroundWorker ですよ。

> 出来る事と出来ない事があるのでしょうか?
メインスレッドで生成された画面コントロール類に対して、
DoWork 内から読み書きを行う事はできません。
コントロールは UI スレッドからアクセスする必要があります。

> WebBrowserを設置して、自動でログインしようとしているだけなのですが・・・
WebBrowser は、HTML の解析にメッセージループを必要とします。

> あと、リロード待ちもエラーが出てしまいます。
具体的にはどのようなエラーでしょうか。 (InvalidOperationException かな?)


> With WebBrowser1
>
>   Do Until .ReadyState = WebBrowserReadyState.Complete
>   Application.DoEvents()
>      Loop
> End With
DoEvents を使うと、それによってイベントの再入が発生する可能性が
あるため、再現させにくいトラブルを引き起こすことがあります。

とはいえ、リロードに関してはスマートな解決法が無いのですけれどね…。
http://bbs.wankuma.com/index.cgi?mode=al2&namber=53711&KLOG=90
http://d.hatena.ne.jp/language_and_engineering/20100410/p1
http://labs.cybozu.co.jp/blog/kaorun/2007/07/ie67bho.html
魔界の仮面弁士さん、返信有り難うございます。

> BackGroundWorker ではなく、
> BackgroundWorker ですよ。

失礼しました。
BackgroundWorkerですね。
以後、気をつけたいと思います。


>>あと、リロード待ちもエラーが出てしまいます。
> 具体的にはどのようなエラーでしょうか。 (InvalidOperationException かな?)
>

InvalidcastException{"指定されたキャストは有効ではありません。"}と、エラーが出てしまいます。



>HTML の解析にメッセージループ

ここら辺をもう少し具体的に教えて頂けたら有り難いです。

例としては、下のように、HtmlDocument hDocumentで解析してすらという事でしょうか?

webBrowser1.DocumentText = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.yahoo.co.jp"

HtmlDocument hDocument = webBrowser1.Document



よろしくお願い致します。
■No27812に返信(ザナドゥさんの記事)
> BackgroundWorkerですね。
先述したように、DoWork イベント内からはフォーム上の
すべてのコントロール(WebBrowser に限らない)に対して、
一切の操作を直接行うべきではないとされますが、
その点は大丈夫でしょうか?


> InvalidcastException{"指定されたキャストは有効ではありません。"}
 InvalidCastException は、型変換を間違えているというエラーですね。
BackgroundWorker を使わなかったときは問題が出ていないのでしょうか。

どの箇所でエラーになっているのかが見えてこないのですが、
第三者が現象を確認できる、最小限のコードを提示することはできますか?


> ここら辺をもう少し具体的に教えて頂けたら有り難いです。
DoWork 内から WebBrowser を操作していないなら問題無いと思います。

> 例としては、下のように、HtmlDocument hDocumentで解析してすらという事でしょうか?
変数に受けるかどうかは任意ですが、Document プロパティへのアクセスは、
DocumentCompleted イベントが発生した後で行うべきです。
(とはいえ、リロード時には同イベントが発生しないのですけれどね)
魔界の仮面弁士、度々の返信有り難うございます。
感謝です。

そして、申し訳ありません・・・DoWork内から操作していました・・・




Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Me.bgWorker.RunWorkerAsync()

End Sub


Private Sub bgWorker_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker.DoWork


Dim id As String
Dim pass As String

id = "honyara"
pass = "honyara2"


WebBrowser1.Navigate("https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.yahoo.co.jp")



'リロード完了待ち
With WebBrowser1

Do Until .ReadyState = WebBrowserReadyState.Complete
Application.DoEvents()
Loop
End With

WebBrowser1.Document.All.GetElementsByName("username")(0).InnerText = id
WebBrowser1.Document.All.GetElementsByName("passwd")(0).InnerText = pass

WebBrowser1.Document.Forms(0).InvokeMember("submit")


My.Application.DoEvents()


End Sub



BackgroundWorkerと利用するのが初めてで、サンプルを見ながら書いてみたのですが、何処に問題があるのでしょうか?


「参考にしたサンプル」
http://www.atmarkit.co.jp/fdotnet/dotnettips/436bgworker/bgworker.html
■No27816に返信(ザナドゥさんの記事)
> 何処に問題があるのでしょうか?
そもそも、ReadyStateをループ待機させている点に問題があります。

Button1_Click では、Navigate メソッドの呼び出しだけを行います。
そうすると、HTML 解析が完了した時点で、WebBrowser の
DocumentComplete イベントが発生しますので、そのタイミングで
ID / Password の処理を行います。

こうすれば、ループ待機させる必要はありませんし、
そもそも BackgroundWorker の出番もありません。


> BackgroundWorkerと利用するのが初めてで、
別の掲示板ですが、基本的な使い方について記述した記事があります。
参考になりますでしょうか。
http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_8979.htm
魔界の仮面弁士さん、ありがとうございます。

下記のリンク、大変参考になりました。
http://homepage1.nifty.com/rucio/commu/ThreadDetail_ThreadId_8979.htm

まだまだ覚えることが沢山ありますね・・・

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