我不知道是否有人可以帮助我 - 我一直在编程VB.Net很长一段时间,但很少必须在ASP.Net中做很多线程。Thread.Join在共享的宿主环境
我正在尝试使用内存浏览器对网站进行“截图”。然后将这些图像记录在数据库中并写入本地文件系统。
当我在本地服务器上运行它时,它一切正常。当我在一个共享主机环境中运行它时,一切都很好,直到我执行一个thread.join时,目标线程立即终止或被卡住(从任一线程接收不到进一步的日志信息)。我已经把它贴在下面
关键的代码也附加了日志,但在短期它:
每个网址,开始一个新的线程和的Thread.join它。新线程将加载浏览器并开始导航。它会在返回生成的位图图像之前停止浏览器加载(下一步)。
在浏览器加载完成时,事件触发。处理程序从浏览器捕获位图图像并将其写入本地。
我做了一些Google搜索,找不到很多相关信息 - 我找到了共同的共享主机问题,并确保我已经覆盖了它们(例如允许部分信任的呼叫者,签署程序集等)。 ..)
如果有人对这个主题有所了解,那么我会非常感激,如果有人愿意指出我的方向,
非常感谢
注:我知道,目前它的将是非常缓慢的,因为它的顺序处理图像 - 但直到我能得到它在一个线程中运行,我没有得到它的机会在多个线程上工作。
这很大程度上是来自代码示例的混乱,我甚至没有开始整理它/更好地组织它,所以对于稍微凌乱的代码表示歉意。
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
道歉,我忘了添加,Webshot类的构造函数只是记录“实例化”,这是您看到的第一个条目与GUID。我还应该补充一点,网站不会返回任何错误 - 我只是获取关联的aspx页面的内容。 – Basic 2010-01-19 02:50:55