Используя делегатов методы BeginInvoke с .Чистый веб 2.0


Я пытаюсь реализовать простой длинный опрос/кометой/обратный Аякс решения, и наткнулась на понятие делегаты, в частности, с помощью метода BeginInvoke и EndInvoke методов. Я создал веб-сервис, который использует эти понятия, но, ни разу не использовал их, они заставляют меня немного нервничать, и у меня есть сомнения в том, что они на самом деле, чего я хочу.

Цель, конечно, заключается в передаче фактической обработки от процессов IIS на другие основы процессов, для сокращения нагрузки на сервер при ожидании на длительный опрос запрос данных. Я не получил это право, но я хочу знать, почему и по крайней мере получить какое-то направление в том, как это можно реализовать лучше (не обязательно решение, но, возможно, статью или документацию).

Веб-службы код:

Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Threading
Imports System.Runtime.InteropServices

<WebService(Namespace:="http://tempuri.org/")> _
<WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Public Class WebService
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    Public Function HelloWorld() As String
        Dim threadId As Integer
        Dim thing As New Things
        Dim caller As New AsyncDoStuff(AddressOf thing.doStuff)
        Dim result As IAsyncResult = caller.BeginInvoke(3000, threadId, Nothing, Nothing)

        result.AsyncWaitHandle.WaitOne()

        Dim returnValue As String = caller.EndInvoke(threadId, result)

        result.AsyncWaitHandle.Close()

        Return returnValue
    End Function
End Class

Public Class Things
    Public Function doStuff(ByVal callDuration As Integer, <Out()> ByRef threadId As Integer) As String
        ' Imagine this method was accessing a database, looking for new information, and returning when it found some
        Thread.Sleep(callDuration)
        threadId = Thread.CurrentThread.ManagedThreadId()
        Return String.Format("My call time was {0}.", callDuration.ToString())
    End Function
End Class

Public Delegate Function AsyncDoStuff(ByVal callDuration As Integer, <Out()> ByRef threadID As Integer) As String


457
8
задан 31 августа 2011 в 03:08 Источник Поделиться
Комментарии