可能 - 如果未在x秒内加载,则取消用户控件渲染?

时间:2009-07-16 14:02:45

标签: asp.net multithreading user-controls captcha recaptcha

这可能是一个百灵鸟,但对于recaptcha控件,因为它有时需要很长时间才能渲染,这可能吗?

如果渲染需要5秒以上,我想停止渲染对象并显示我自己的验证码。

我会在页面加载时启动一个计时器,如果已经过了5秒,在某些情况下,在recaptcha控件(prerender?)中,我会取消渲染或使其不可见或者其他效果。它是第三方用户控件,所以我没有源代码。

更新

我发布后尝试了下面的代码。它的工作原理是,如果用户控件无法连接其服务器,即 - 我断开了我的互联网连接,但是当控件等待服务器返回时,它暂时没有停顿它。即使我将毫秒间隔更改为1,控件也会呈现。

<MTAThread()> _
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        Dim ucChk As New UCExistenceChecker(recaptcha, Me)
        Dim doFindUC As System.Threading.TimerCallback = AddressOf ucChk.FindUC
        Dim stateTimer As System.Threading.Timer = New System.Threading.Timer(doFindUC, Nothing, 0, 5000)
    End If

End Sub

Public Class UCExistenceChecker

    Dim _r As Recaptcha.RecaptchaControl
    Dim _pg As Page

    Sub New(ByVal r As Recaptcha.RecaptchaControl, ByVal pg As Page)
        _r = r
        _pg = pg
    End Sub

    Sub FindUC(ByVal stateInfo As Object)
        If _pg.FindControl("recaptcha") Is Nothing Then
            _r.SkipRecaptcha = True  'This "unrenders" the control, sort of.
        End If
    End Sub

End Class

1 个答案:

答案 0 :(得分:1)

您可以使用iframe来包含验证码块并订阅readystatechanged或layoutcomplete事件。然后,您可以使用setTimeout()来安排某些JavaScript在您需要等待的最长时间之后运行,如果这些事件都没有触发,请从DOM中删除iframe并将其替换为您自己的iframe。