Ich versuche, etwas asynchrone Sachen in einer Webservice-Methode zu tun. Nehmen wir an, ich habe den folgenden API-Aufruf: http://www.example.com/api.asmx.NET Web Service & BackgroundWorker Themen
und die Methode heißt GetProducts().
Ich diese GetProducts-Methoden, ich mache ein paar Sachen (zB Daten aus der Datenbank) dann kurz bevor ich das Ergebnis zurückgebe, möchte ich etwas asynchrone Sachen (zB senden Sie mir eine E-Mail).
Also das ist was ich getan habe.
[WebMethod(Description = "Bal blah blah.")]
public IList<Product> GetProducts()
{
// Blah blah blah ..
// Get data from DB .. hi DB!
// var myData = .......
// Moar clbuttic blahs :) (yes, google for clbuttic if you don't know what that is)
// Ok .. now send me an email for no particular reason, but to prove that async stuff works.
var myObject = new MyObject();
myObject.SendDataAsync();
// Ok, now return the result.
return myData;
}
}
public class TrackingCode
{
public void SendDataAsync()
{
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += BackgroundWorker_DoWork;
backgroundWorker.RunWorkerAsync();
//System.Threading.Thread.Sleep(1000 * 20);
}
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
SendEmail();
}
}
Jetzt, wenn ich diesen Code ausführen, wird die E-Mail nie gesendet. Wenn ich den Thread.Sleep auslasse, wird die E-Mail gesendet.
Also ... warum ist der Hintergrund Worker Thread abgerissen? hängt es vom übergeordneten Thread ab? Ist das der falsche Weg, den ich tun sollte, Hintergrund oder gespalten Threading, in asp.net Web-Anwendungen?
Der Schlaf ist auskommentiert. Ich habe das da hingestellt, um zu sehen, ob ich eine E-Mail schicken könnte. Wenn der Schlaf nicht KOMMENTIERT ist, wird der Hintergrund-Worker-Thread-Code ausgeführt. Wenn der Code ausgegeben wird, wird der Hintergrund-Worker-Thread-Code niemals ausgeführt. Ich werde stattdessen ThreadPool verwenden. –
> * Wenn Sie hohe Volumina haben, kann eine Producer/Consumer Queue eine bessere Throttling erlauben (damit Sie nicht in Threads ertrinken) * ooooooo !!!Ich bin froh, dass du diesen Punkt angesprochen hast! Die Web-Service-Methode ist eigentlich ein hohes Volumen! Außerdem, um die Sache wirklich interessant zu machen, sendet es nicht wirklich eine E-Mail, sondern trifft eine andere externe Website (ekk, frag nicht) ... also würdest du vorschlagen, dass ich dieses Producer/Consumer-Queue-Thingy mache? Wenn ja ... ist das eine gute Referenz? http://www.albahari.com/threading/part4.aspx (scrollen Sie bitte ein wenig nach unten zum Code + ein Beispiel). Gedanken? –
@Marc Gravell Ich habe versucht, Ihre Lösung zu verwenden, aber ich frage mich nur, warum es zu viel Zeit braucht, um die Aufgabe abzuschließen. – AnandMohanAwasthi