Я пытаюсь сделать что-то асинхронное в методе веб-сервиса. Допустим, у меня есть следующий вызов API: http://www.example.com/api.asmx
и метод называется GetProducts () .
Я использую эти методы GetProducts, я делаю некоторые вещи (например, получаю данные из базы данных), а затем, перед тем как вернуть результат, я хочу сделать некоторые асинхронные вещи (например, отправьте мне электронное письмо).
Так вот, что я и сделал.
[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();
}
}
Теперь, когда я запускаю этот код, электронное письмо никогда не отправляется. Если я раскомментирую Thread.Sleep .., письмо отправляется.
Итак ... почему же фоновый рабочий поток сорван? это зависит от родительского потока? Это неправильный способ, которым я должен выполнять фоновую или разветвленную многопоточность в веб-приложениях asp.net?