当前位置:  开发笔记 > 编程语言 > 正文

.NET Web服务和BackgroundWorker线程

如何解决《.NETWeb服务和BackgroundWorker线程》经验,为你挑选了1个好方法。

我试图在webservice方法中做一些异步的东西.假设我有以下API调用:http://www.example.com/api.asmx

并且该方法称为GetProducts().

我这个GetProducts方法,我做了一些事情(例如从数据库中获取数据)然后在我返回结果之前,我想做一些异步的东西(例如给我发电子邮件).

所以这就是我所做的.

[WebMethod(Description = "Bal blah blah.")]
public IList 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网络应用程序中做背景或分叉线程的错误方法吗?



1> Marc Gravell..:

BackgroundWorker当您需要同步回(例如)UI*线程时,例如出于亲和力原因,它非常有用.在这种情况下,似乎简单地使用ThreadPool就足够了(而且更简单).如果你的数量很大,那么生产者/消费者队列可以允许更好的限制(所以你不要淹没在线程中) - 但我怀疑ThreadPool这里会好的......

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

另外 - 我不太确定你想通过睡觉达到什么目的?这只会占用一个线程(不使用CPU,但也没有好处).注意详细说明?它看起来像你暂停您的实际网页(即睡眠发生在Web页主题,而不是邮件线程).你想在这做什么?

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

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有