我不知道是否有人能帮助我 - 我一直在很长一段时间编程VB.Net但很少有做多线程在ASP.Net

我试图采取使用一个内存中的浏览器网站“截屏”。然后,这些图像被记录在一个数据库并写入到本地文件系统。

当我在我的本地服务器上运行,这一切工作正常。当我在一个共享的主机环境中运行它,它是所有罚款,直到我在这一点无论是目标线程立即终止或卡住一个的Thread.join(没有进一步的记录信息是从任一线程接收)。我已附加以下

的日志

在关键码也附但在短作用:

有关每个URL,启动一个新的线程和的Thread.join到它。新的线程将加载浏览器并开始导航。然后它会NOOP直到浏览器负载已经返回生成的位图图像(下一步骤)之前完成。

在浏览器负载完成后,一个事件触发。该处理程序从浏览器捕获的位图图像,并将其写入到本地

我已经做了一些谷歌上搜索,并不能找到很多相关的信息 - 我已经找到了共同的共享主机的问题,并已取得肯定我明白了他们覆盖(例如,允许部分信任的调用方,签约组件等。 。)

我会很感激,如果任何人有关于这个主题的知识将是一种足以点我在正确的方向。

非常感谢

注:我知道,目前它的将是非常缓慢的,因为它的处理顺序图像 - 但直到我能得到它在一个线程中运行,我没有得到它在多线程工作的机会

此在很大程度上从代码样本错位在一起,我甚至还没有开始整理一下/更好地组织它所以道歉为略微乱码。

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,因为它运行一个交互式Windows应用程序,而后者,你会运行作为可以没有UI和线程的行为由IIS从严治党的服务。

您可以尝试在Page指令设置aspcompat =“真”,但多不容易,托管公司已经配置了IIS工作进程Ping将终止无响应的定义的时间段线程。

在底线是,WebBrowser控件(和SHDOCVW ActiveX控件,它包)没有被设计在一个非交互式服务流程工作,你很可能会在一个爬坡试图使其工作。不幸的是,我不知道任何然而更安全的替代的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top