Using Delegates and BeginInvoke with .NET 2.0 WebServices
This Stack Overflow answer to the question "Is there a VB.NET equivalent of C# out parameters" is pretty clear:


  No, there is no equivalent construct that allows a non-initialised variable to be passed to a method without a warning [...]


However specifying the &lt;Out()&gt; attribute, despite being ignored by VB (ByRef is all you need, really), does allow a C# client to use it as an out parameter - so good call then!



Declaring the delegate at the bottom of the module, after it's being used, makes it uselessly confusing and prompts for unnecessary scrolling; I would have put it at the top... actually, I would have made the delegate a public member of the WebService class:

Public Class WebService
    Inherits System.Web.Services.WebService

    Public Delegate Function AsyncDoStuff(ByVal callDuration As Integer, &lt;Out()&gt; ByRef threadID As Integer) As String

    '...




I very, very seldom declare my own delegate types, if at all. I don't like ref ByRef and out &lt;Out()&gt; parameters either - I think they should be avoided.

In this case I would have gone with a Func&lt;int,AsyncStuffResult&gt; (please excuse the C# notation), where the int parameter is the callDuration, and the AsyncStuffResult is a class that encapsulates everything you want to return from the function call - whatever that is.

This way if/when you need to return more things, your signature doesn't need to change, you only add new members to your result class - note that the EventArgs class fulfills the same goal.

Public Class AsyncStuffResult
    '- expose ThreadId as a get-only property
    '- expose your String result as a get-only property, too
    '- expose a constructor to assign the members
End Class