Pur*_*ome 14 c# asp.net multithreading backgroundworker
我试图在webservice方法中做一些异步的东西.假设我有以下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();
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我运行此代码时,电子邮件永远不会发送.如果我取消注释Thread.Sleep ..然后发送电子邮件.
那么......为什么背景工作者线程被拆除了?它依赖于父线程吗?这是我在asp.net网络应用程序中做背景或分叉线程的错误方法吗?
Mar*_*ell 18
BackgroundWorker当您需要同步回(例如)UI*线程时,例如出于亲和力原因,它非常有用.在这种情况下,似乎简单地使用ThreadPool就足够了(而且更简单).如果你的数量很大,那么生产者/消费者队列可以允许更好的限制(所以你不要淹没在线程中) - 但我怀疑ThreadPool这里会好的......
public void SendDataAsync()
{
ThreadPool.QueueUserWorkItem(delegate
{
SendEmail();
});
}
Run Code Online (Sandbox Code Playgroud)
另外 - 我不太确定你想通过睡觉达到什么目的?这只会占用一个线程(不使用CPU,但也没有好处).注意详细说明?它看起来像你暂停您的实际网页(即睡眠发生在Web页主题,而不是邮件线程).你想在这做什么?
*=实际上,它将使用任何同步上下文
| 归档时间: |
|
| 查看次数: |
16877 次 |
| 最近记录: |