共有ホスティング環境でThread.Join
-
21-09-2019 - |
質問
私は、誰かが私を助けることができるかどうか疑問 - 。私は長い時間のためにVB.Netのプログラミングをしてきたが、めったにASP.Netで多くのスレッドをしなければならなかったなかった。
私は、メモリ内のブラウザを使用して、ウェブサイトの「スクリーンショット」を取るしようとしています。これらの画像は、その後、DBに記録し、ローカルファイルシステムに書き込まれます。
私は私のローカルサーバー上でそれを実行すると、は、それはすべての罰金に動作します。私は、共有ホスティング環境でそれを実行すると、私は、ターゲットスレッドがすぐに終了するか立ち往生(それ以上のログ情報は、いずれかのスレッドから受信されない)のいずれかその時点でthread.joinを行うまで、それはすべての罰金です。私は、以下のログを添付しました。
重要なコードも装着されているが、要するにそれがない
URLごとに、それへの新しいスレッドとthread.joinを開始します。新しいスレッドは、ブラウザをロードし、ナビゲーションを開始します。ブラウザ負荷が生成されたビットマップイメージ(次のステップ)を返す前に完了するまでは、NOOPされます。
ブラウザのロードが完了すると、イベントが発生します。ハンドラは、ブラウザからのビットマップ画像をキャプチャし、ローカルに書き込みます。
私はいくつかのグーグルをやったし、関連情報をたくさん見つけることができません - 私は、共通の問題を共有ホスティングして確認してください、私は彼らがカバー持っている(作った発見した例など、アセンブリに署名し、部分的に信頼できる呼び出し元を許可します。.. 。)
このトピックに関する知識を持つ誰もが正しい方向に私を指すように親切になる場合、私はそれをいただければと思います。
多くの感謝
NB:私は現時点では、それは順次、画像を処理していますと非常に遅いことになるだろうことを承知している - しかし、私は1つのスレッド上で動作するようにそれを得ることができるまで、私は複数のスレッドに取り組んでそれを得ることのチャンスを持っていません。 P>
これは主に、コードサンプルから一緒に台無しにされ、私も少し汚いコードについて謝罪ので、より良い、それを整理する/それを整理するために開始していない。
Public Function GetWebsiteImage(ByVal URL As String, Optional ByVal BrowserWidth As Integer = 1280, Optional ByVal BrowserHeight As Integer = 1024) As Bitmap
LogIt(String.Format("Webshot {1}: {0}", "Getting Image", id))
_URL = URL
_BrowserHeight = BrowserHeight
_BrowserWidth = BrowserWidth
Dim T As Thread
T = New Thread(New ThreadStart(AddressOf GenerateImage))
T.SetApartmentState(ApartmentState.STA)
'T.IsBackground = True
LogIt(String.Format("Webshot {1}: {0}", "Starting Thread", id))
T.Start()
'*** THIS IS THE LAST LOG ENTRY I SEE ***
LogIt(String.Format("Webshot {1}: {0}", "Joining Thread", id))
T.Join()
Return _Bitmap
End Function
Friend Sub GenerateImage()
LogIt(String.Format("Webshot {1}: {0}", "Instantiating Web Browser", id))
Dim _WebBrowser As New WebBrowser()
_WebBrowser.ScrollBarsEnabled = False
LogIt(String.Format("Webshot {1}: {0}", "Navigating", id))
_WebBrowser.Navigate(_URL)
AddHandler _WebBrowser.DocumentCompleted, AddressOf WebBrowser_DocumentCompleted
'AddHandler _WebBrowser.
While _WebBrowser.ReadyState <> WebBrowserReadyState.Complete
Application.DoEvents()
End While
LogIt(String.Format("Webshot {1}: {0}", "Disposing", id))
_WebBrowser.Dispose()
End Sub
Private Sub WebBrowser_DocumentCompleted(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
LogIt(String.Format("Webshot {1}: {0}", "Document load complete", id))
Dim _WebBrowser As WebBrowser = DirectCast(sender, WebBrowser)
_WebBrowser.ClientSize = New Size(Me._BrowserWidth, Me._BrowserHeight)
_WebBrowser.ScrollBarsEnabled = False
_Bitmap = New Bitmap(_WebBrowser.Bounds.Width, _WebBrowser.Bounds.Height)
_WebBrowser.BringToFront()
_WebBrowser.DrawToBitmap(_Bitmap, _WebBrowser.Bounds)
_PageTitle = _WebBrowser.DocumentTitle
LogIt(String.Format("Webshot {1}: {0}", "About to capture bitmap", id))
_Bitmap = DirectCast(_Bitmap.GetThumbnailImage(_BrowserWidth, _BrowserHeight, Nothing, IntPtr.Zero), Bitmap)
LogIt(String.Format("Webshot {1}: {0}", "Bitmap captured", id))
End Sub
と私は見たログエントリ:
2010 01 19 02:21:01 > Starting Process
2010 01 19 02:21:01 > Capture 229 Processing: http://www.obfuscated.com/
2010 01 19 02:21:01 > Capture 229 Found capture db record
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Instantiated
2010 01 19 02:21:01 > Capture 229 Requesting image
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Getting Image
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Starting Thread
2010 01 19 02:21:01 > Webshot f7710f41-cac0-4ed1-93df-020620257c91: Joining Thread
解決
は、ローカルサーバー上でそれを実行しているときは、ASP.NET個人のWebサーバーやIISのローカルインストールを意味していますか?後者では、IISによって厳密に管理されて何のUIスレッドの振る舞いを持つことはできませんサービスとして実行されます一方、それは対話型のWindowsアプリケーションとして実行されるため、前者はIISにしても比較することはできません。
あなたはPageディレクティブに=「true」をASPCOMPAT設定してみてください、より多くの可能性がない以上でした、ホスティング会社は、一定の期間のために応答しないスレッドを終了しますIISワーカープロセスのpingを設定しています。
一番下の行は、非対話型サービスプロセスで動作するように設計されており、あなたはそれの仕事にしようとして上り坂を登るために可能性が高いですされていない(それがラップしていることとSHDOCVW ActiveXコントロール)WebBrowserコントロールということです。残念ながら、私は、しかし、任意のより安全な代替を知りません。