.NET Web服务&;BackgroundWorker线程

本文关键字:BackgroundWorker 线程 amp Web 服务 NET | 更新日期: 2023-09-27 17:48:50

我正在尝试在Web服务方法中做一些异步的事情。假设我有以下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网络应用程序中进行后台或分叉线程处理的错误方式吗?

.NET Web服务&;BackgroundWorker线程

BackgroundWorker在需要同步回(例如)一个UI*线程时非常有用,例如出于关联原因。在这种情况下,简单地使用ThreadPool似乎绰绰有余(而且要简单得多)。如果您的卷很高,那么生产者/消费者队列可能允许更好的节流(这样您就不会淹没在线程中),但我怀疑ThreadPool在这里会很好。。。

public void SendDataAsync()
{
    ThreadPool.QueueUserWorkItem(delegate
    {
        SendEmail();
    });
}

还有,我不太确定你想通过睡觉达到什么目的?这只会占用一个线程(不使用CPU,但也没有什么好处)。想详细说明吗?它看起来像是在暂停实际的网页(即睡眠发生在网页线程上,而不是电子邮件线程上)。你在这里想干什么?

*=实际上,它将使用中的任何同步上下文

再生产者/消费者;基本上-只需要保留一些类型的油门。在最简单的级别上,可以使用Semaphore(与常规ThreadPool一起)来将事情限制在已知的工作量内(以避免线程池饱和);但是生产者/消费者队列可能更高效和管理。

Jon Skeet在这里有这样一个队列(CustomThreadPool)。如果你愿意的话,我可能会写一些笔记。

也就是说:如果你正在调用一个外部网站,很可能你会在网络IO/完成端口上有很多等待;因此,您可以拥有略高数量的线程。。。显然(相比之下),如果工作是CPU绑定的,那么拥有比CPU内核更多的线程是没有意义的。

它可能会被拆除,因为20秒后,BackgroundWorker实例可能会被垃圾收集,因为它没有引用(超出范围)。

相关文章:
  • 没有找到相关文章