Quello che chiedi tu (al di la di cosa fai nella procedura lenta sia che inserisci un milione di record sia che stampi la divina commedia) si puo' fare in entrambi i modi solo che devi imparare a chiamare le funzioni "lente" in maniera asincrona e attraverso l'uso di delegati o di altri artifizi (come quello suggerito nell'articolo) accorgerti quando la funzione e' finita.
La procedura lenta la metti ad esempio in un progetto libreria. Crei un web service che fa riferimento a questa libreria ed espone un web method al mondo esterno che permette di iniziare la procedura.
Come forse saprai, quando aggiungi un riferimento ad un web service vstudio (o chi per lui) e' cosi intelligente da crearti gia' tutti i metodi asincroni per chiamare il web service es. begin_nomefunzione end_nomefunzione.
Di seguito ti posto un esempio funzionante che utilizza un web service il cui riferimento nel progetto web l'ho chiamato datiremoti e che e' costituito da una pagina dati.asmx che espone un webmethod GetClienti.
codice:
'Questo metodo viene chiamato quando si vuole iniziare la procedura lenta
Sub CallAsync()
If Session("callBackResult") Is Nothing Then
If Not callStarted Then
Dim ws As New DatiRemoti.Dati
Dim ar As IAsyncResult
ar = ws.BeginGetClienti(parametrivari, AddressOf RisultatiCallBack, ws)
callStarted = True
SetMessage("caricamento in corso")
Else
SetMessage("Procedura gia iniziata")
End If
Else
Dim ds As DataSet = CType(Session("callBackResult"), DataSet)
ds.DataSetName = "Clienti"
SetMessage("Procedura terminata correttamente")
End If
End Sub
'Questo metodo viene chiamato quando finisce quello asincrono
Sub RisultatiCallBack(ByVal ar As IAsyncResult)
Dim ws As DatiRemoti.Dati
Dim ds As DataSet
ws = DirectCast(ar.AsyncState, DatiRemoti.Dati)
ds = ws.EndGetClienti(ar)
callStarted = False
Session("callBackResult") = ds
End Sub
Private Property callStarted() As Boolean
Get
If Not Session("CallStarted") Is Nothing Then
Return CType(Session("CallStarted"), Boolean)
End If
Return False
End Get
Set(ByVal Value As Boolean)
Session("CallStarted") = Value
End Set
End Property