【问题标题】:running a thread from within a vb.net webservice从 vb.net webservice 中运行线程
【发布时间】:2010-10-17 13:56:13
【问题描述】:

大家好,我有一个带有 web 方法的 web 服务,它通过 POST 接受来自客户端的 XML(不知道这是否真的重要),验证 XML 和里面的数据,然后处理 XML 并返回一个答案客户。

目前,我遇到了大型 XML 的问题; XML 预处理完成时间过长,客户端超时。

我认为我可以通过在处理 XML 的验证之后启动一个新线程并同时将验证答案返回给客户端来将 XML 验证与 XML 处理分开,而不是增加客户端的超时时间。 (如果 XML 无效,则不会开始处理。

现在我的问题是:打开新线程会增加内存使用量吗?通常我会猜测它会(对于普通应用程序)但在这里我向客户端返回一个答案并基本上结束主线程的进程。

还有一个问题,我实际上试图创建一个小型 web 服务,但出于某种原因,即使 web 方法完成,客户端也不会得到答案,直到线程死亡......我我做错了什么?

好的,我重写了小型 Web 服务,它确实有效(我还没有在真实代码上尝试过 - 它有点复杂)。
如果有人想要,这是示例代码:

Imports System.Web.Services
Imports System.Web.Services.Protocols    
Imports System.ComponentModel

' To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
' <System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService()> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class DemoService
    Inherits System.Web.Services.WebService

       <WebMethod()> _
    Public Function XMLReceiver(ByVal XMLData As String) As Integer
        Dim retval As Integer = Validate(XMLData)
        Dim thrd As New Threading.Thread(AddressOf Process)
        thrd.Start()
        Return retval
    End Function

    Public Function Validate(ByVal XMLData As String) As Integer
        Return 0
    End Function

    Public Sub Process()
        'get time
        Dim start As Date = Date.Now
        'do work
        Threading.Thread.Sleep(1000 * 10)
        'notification (actually write to DB)
        Dim writer As New IO.StreamWriter("C:\done.txt")
        writer.WriteLine("From " & start.ToLongTimeString & " To " & Date.Now.ToLongTimeString & " done!")
        writer.Close()
    End Sub
End Class

所以现在这只是第一个问题的问题。

谢谢大家

【问题讨论】:

  • 你能展示你用来创建/加入你的线程的代码吗?

标签: vb.net multithreading web-services


【解决方案1】:

我认为您不需要更改 XML 流程逻辑,而是您的客户端如何调用它。您应该异步调用 Web 服务。因此,您将提供一个回调方法,当 Web 服务完成其工作时将调用该方法。现在没有看到代码,很难提出任何真正的答案,但我认为根据你到目前为止所写的内容,这可能是问题所在。

【讨论】:

  • 我添加了上面的代码。我不想使用异步调用。在我验证 XML 之后,我可以检索到答案——这是客户唯一关心的事情,我不想让他挂第二个电话,因为在我给他结果之前他没有其他事情可做。处理与客户无关。
  • 在再次阅读您的评论并发布演示代码后,似乎我没有任何地方可以调用 Thread.Join()。这有关系吗?谢谢!
  • 很遗憾,在这种情况下我帮不上什么忙,抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多