2012-01-12 14 views
6

Ho un servizio web che può essere suddiviso in due sezioni principali:ASP.Net Web Service: il codice in esecuzione in modo asincrono

[WebMethod] 
MyServiceCall() 
{ 
    //Do stuff the client cares about 

    //Do stuff I care about 
} 

Quello che mi piacerebbe fare è eseguire tale 2a parte su un altro thread, in modo che il cliente non è in attesa su di esso: una volta che la logica dell'utente ha completato, inviare loro le loro informazioni immediatamente, ma continuare a elaborare la roba mi interessa (registrazione, ecc).

da un servizio Web, qual è il modo consigliato di esecuzione che secondo pezzo in modo asincrono, per ottenere l'utente di nuovo le loro informazioni il più rapidamente possibile? BackgroundWorker? QueueUserWorkItem?

+2

Hai letto questo: http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background -tasks-in-Asp-net.aspx –

risposta

4

si consiglia di guardare in Tasks che sono nuovi per .NET 4.0.

Esso consente di dare il via un'operazione asincrona, ma anche ti dà un modo semplice per vedere se è fatto o non più tardi.

Avvierà DoSomeWork() e continuerà senza attendere in modo da poter continuare a eseguire l'altra elaborazione. Quando si arriva al punto in cui non si desidera elaborare più fino a quando il compito asincrona è terminata, è possibile chiamare:

task.Wait(); 

che attende lì fino a quando l'operazione è stata completata. Se si vuole ottenere un risultato di nuovo dal compito, si può fare questo:

var task = Task.Factory.StartNew(() => 
{ 
    Thread.Sleep(3000); 
    return "dummy value"; 
}); 
Console.WriteLine(task.Result); 

Una chiamata ai blocchi task.Result fino a quando il risultato è disponibile.

Ecco un tutorial che copre le attività in modo più dettagliato: http://www.codethinked.com/net-40-and-systemthreadingtasks

+0

Accettando questa come la risposta; tuttavia, ritengo che in questo momento non riuscirò a implementarlo, dopo aver letto il post sul blog nel commento di Darin Dimitrov. Sembra che potrebbero esserci problemi nel fare ciò se il dominio in cui è in esecuzione viene arrestato/riciclato – John

1

Il modo più semplice per sparare un nuovo thread è probabilmente:

new Thread(() => 
{ 
    /// do whatever you want here 
}).Start(); 

Attenzione, però - se il servizio viene colpito molto spesso, si potrebbe finire la creazione di un sacco di fili che bloccano a vicenda.

Problemi correlati