【问题标题】:Returning a value from a function after an elapsed amount of time?经过一段时间后从函数返回值?
【发布时间】:2010-04-20 04:02:45
【问题描述】:

我在 ASP.NET 中有一个 Web 服务被一个时间敏感的进程调用。如果 Web 服务的运行时间超过 N 秒,我想从调用中返回,以便时间敏感的操作可以继续。这可能吗?如果可以,代码是什么?

【问题讨论】:

    标签: .net asp.net web-services


    【解决方案1】:

    【讨论】:

    • 我考虑过这个......我试图绕过这样做的原因是为了避免编译引用该服务的应用程序。
    【解决方案2】:

    让 Web 服务在单独的线程中调用其长时间运行的部分。然后等待,杀了它,如果时间太长就保释。请注意,这可能会使稀缺资源陷入困境(例如,数据库连接等),但您也可以解决此问题。

    (抱歉,代码又快又脏,这是为了演示,您应该详细说明并添加类型、Web 服务细节等)

    dim ResultFromWorker as String
    dim DoneWorking as boolean
    
    sub GetWebServiceMagicNumber
        DoneWorking = False
        dim t as new thread = addressof (GetWebServiceMagicNumber_Worker)
        t.start
        dim count as integer = 0
        while not DoneWorking and Count <100 
            count +=1
            System.Threading.Thread.Sleep(100) ' Important to not kill CPU time
        wend
        if DoneWorking then
            return ResultFromWorker
        else
            return "TimeOut"
        EndIf
    end sub
    
    sub GetWebServiceMagicNumber_Worker
        try
            ResultFromWorker = SearchTheWholeWorldForTheAnswer()
        catch ex1 as ThreadAbortException 
            ' ignore - My code caused this on purpose
            ' calling thread should clean up scarce resources, this is borrowed time
        catch ex2 as Exception
            ResultFromWorker = "Error - " & ex.tostring
        finally
            DoneWorking=True
        End Try
    end sub
    

    【讨论】:

    • 糟糕!对于那些寻找...我忘了在声明'return“TimeOut”'之前杀死线程。当 web 服务返回时,它仍然会自行结束,但如果再次调用,如果您使用相同的对象 2x,则可能会混淆共享成员变量。
    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多