我试图在webservice方法中做一些异步的东西.假设我有以下API调用:http://www.example.com/api.asmx
并且该方法称为GetProducts().
我这个GetProducts方法,我做了一些事情(例如从数据库中获取数据)然后在我返回结果之前,我想做一些异步的东西(例如给我发电子邮件).
所以这就是我所做的.
[WebMethod(Description = "Bal blah blah.")] public IListGetProducts() { // 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网络应用程序中做背景或分叉线程的错误方法吗?
BackgroundWorker
当您需要同步回(例如)UI*线程时,例如出于亲和力原因,它非常有用.在这种情况下,似乎简单地使用ThreadPool
就足够了(而且更简单).如果你的数量很大,那么生产者/消费者队列可以允许更好的限制(所以你不要淹没在线程中) - 但我怀疑ThreadPool
这里会好的......
public void SendDataAsync() { ThreadPool.QueueUserWorkItem(delegate { SendEmail(); }); }
另外 - 我不太确定你想通过睡觉达到什么目的?这只会占用一个线程(不使用CPU,但也没有好处).注意详细说明?它看起来像你暂停您的实际网页(即睡眠发生在Web页主题,而不是邮件线程).你想在这做什么?
*=实际上,它将使用任何同步上下文