2010-10-17 2 views
2

Привет всем У меня есть веб-сервис с веб-методом, который принимает XML от клиента через POST (не знаю, действительно ли это имеет значение), проверяет XML и данные внутри, и затем обрабатывает XML и возвращает ответ клиенту.работает поток изнутри vb.net webservice

В данный момент у меня проблема с большими XML-файлами; для завершения предварительной обработки XML требуется слишком много времени, и истечет время ожидания клиентов.

Вместо увеличения тайм-аута клиента я думал, что могу отделить проверку XML от обработки XML, запустив новый поток после проверки, который обрабатывает XML и в то же время возвращает ответ проверки правильности клиенту. (обработка не начнется, если XML недействителен.

Теперь мой вопрос: Будет ли новый поток увеличивать использование памяти? Обычно я предполагаю, что это будет (для обычных приложений), но здесь я возвращаюсь ответ клиента и по существу окончания процесса основного потока.

и еще один вопрос, я на самом деле пытался создать небольшой WebService, который делает только что, но по какой-то причине, даже если WebMethod был закончен, клиент не получал бы ответа до тех пор, пока нить не погибла ... я делаю что-то не так?

Хорошо, я переписал небольшой веб-сервис, и он работает (я еще не пробовал это на реальном коде) - это немного сложнее).
Это пример кода, если кто-то хочет его:

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 

Так теперь это только вопрос первого вопроса.

Спасибо всем

+0

Не могли бы вы показать код, который вы использовали для создания/присоединения к своей теме? – smirkingman

ответ

0

Я не думаю, что вам нужно изменить логику процесса XML, но, как ваш клиент называет. Вы должны асинхронно вызывать веб-сервис. Таким образом, вы бы предоставили метод обратного вызова, который будет вызываться, когда веб-сервис завершит свою работу. Теперь, не видя кода, сложно предложить какой-либо реальный ответ, но я думаю, основываясь на том, что вы написали до сих пор, это может быть проблемой.

+0

Я добавил код выше. Я не хочу использовать асинхронные звонки. После проверки XML я могу получить ответ - это единственное, что заботится об этом клиенту, и я не хочу, чтобы он держал его на второй вызов, потому что ему больше нечего делать, пока я не дам ему результат. Обработка не касается клиента. –

+0

после прочтения вашего комментария и отправки демо-кода, кажется, у меня нет нигде, что я называю Thread.Join(). Это имеет значение? Благодаря! –

+0

Я, к сожалению, не очень помог в этом случае, извините. – Wade73

Смежные вопросы