2010-01-19 84 views
2

我不知道是否有人可以帮助我 - 我一直在编程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 
+0

道歉,我忘了添加,Webshot类的构造函数只是记录“实例化”,这是您看到的第一个条目与GUID。我还应该补充一点,网站不会返回任何错误 - 我只是获取关联的aspx页面的内容。 – Basic 2010-01-19 02:50:55

回答

1

当你在本地服务器上运行它,你的意思是ASP.NET个人Web服务器或IIS的本地安装?前者甚至不能与IIS相媲美,因为它作为交互式Windows应用程序运行,而后者则作为无UI的服务运行,并且线程行为严格受IIS管理。

您可以尝试在Page指令中设置aspcompat =“true”,但更有可能的是,托管公司已配置IIS工作进程pinging,它将终止在指定时间段内没有响应的线程。

底线是WebBrowser控件(和它包装的SHDocVw ActiveX控件)不能用于非交互式服务过程,并且您可能需要努力攀登才能使其工作。不幸的是,我不知道任何更安全的替代品。

+0

你说得对,我指的是IDE中的网站主机。我确信这是可能的,因为我已经看到了它,但不幸的是我不记得确切的方法(我记得它是一只猪)。 感谢您的建议重新appcompat - 我会试一试。如果我需要一段时间再次回复,我将在下周之前离开我的电脑,以致歉意。 – Basic 2010-01-20 12:05:02