asp.net - Thread.Join在共享托管环境中

标签 asp.net multithreading shared-hosting apartments

我想知道是否有人可以帮助我-我已经对VB.Net进行了很长时间的编程,但是很少在ASP.Net中进行过多的线程处理。

我正在尝试使用内存浏览器拍摄网站的“屏幕截图”。然后,将这些镜像记录在DB中并写入本地文件系统。

当我在本地服务器上运行它时,一切正常。当我在共享托管环境中运行它时,一切都会好起来,直到我执行一个thread.join,此时目标线程会立即终止或被卡住(任何一个线程都没有收到进一步的日志记录信息)。我已附上以下日志

关键代码也已附加,但总而言之:

对于每个URL,启动一个新线程,然后将thread.join加入其中。新线程将加载浏览器并开始导航。然后它将一直不停,直到浏览器加载完成,然后返回生成的位图图像(下一步)。

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

我已经进行了一些谷歌搜索,但是找不到很多相关信息-我发现了常见的共享托管问题,并确保已将其覆盖(例如,允许部分受信任的调用者,对程序集进行签名等)。

如果对这一主题有知识的任何人都足够友好地为我指出正确的方向,我将不胜感激。

非常感谢

NB:我知道目前它会很慢,因为它顺序地处理图像-但是,直到我能使它在一个线程上工作之前,我才没有机会使其在多个线程上工作。

这在很大程度上是从代码示例中混在一起的,我什至还没有开始整理它/更好地组织它,因此对稍微凌乱的代码表示歉意。

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 =“true”,但托管公司很有可能配置了IIS工作进程ping,该ping将终止在定义的时间段内无响应的线程。

最重要的是,WebBrowser控件(及其包装的SHDocVw ActiveX控件)并非旨在在非交互式服务过程中工作,您可能需要进行艰苦的尝试才能使其正常工作。不幸的是,我不知道任何更安全的选择。

关于asp.net - Thread.Join在共享托管环境中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2090728/

相关文章:

asp.net - 有关从 ASP.NET MVC 应用程序播放声音文件的建议

java - Swing 并发和事件分发线程

php - 共享主机环境中的 sys_get_temp_dir

Angular : Host assets and javascript on an independent server

c# - 无法在我的网络服务中使用公共(public)类(class)

c# - 在 ASP.NET MVC 和 Azure AD 中创建自定义用户角色

android - 从 native 代码检测 Android 上的 CPU 内核数

java - 我的循环自己退出

laravel-5 - 连接被拒绝 [tcp ://127. 0.0.1:6379] 共享主机上的 redis

c# - 消息在进行事务处理时未到达 MSMQ