c# - .NET Web 服务和 BackgroundWorker 线程

标签 c# asp.net multithreading backgroundworker

我正在尝试在网络服务方法中执行一些异步操作。假设我有以下 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 网络应用程序中执行后台或 fork 线程的错误方式吗?

最佳答案

BackgroundWorker 在您需要同步回(例如)UI* 线程时很有用,例如出于关联原因。在这种情况下,似乎仅使用 ThreadPool 就足够了(而且简单得多)。如果您的数据量很大,那么生产者/消费者队列可能会允许更好的节流(这样您就不会淹没在线程中)-但我怀疑 ThreadPool 在这里会很好...

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

另外 - 我不太确定你想通过 sleep 达到什么目的?这只会占用一个线程(不使用 CPU,但也没有任何好处)。想详细说明吗? 看起来您正在暂停您的实际网页(即 sleep 发生在网页线程,而不是电子邮件线程)。你想在这里做什么?

*=实际上,它会使用任何合适的同步上下文

关于c# - .NET Web 服务和 BackgroundWorker 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/228775/

相关文章:

c# - WPF 组合框数据绑定(bind)所选项目

C# - 在 Silverlight 中访问 xap 内部的图像流

c# - Linq2SQL 处理具有唯一约束的表上的插入/删除

c# - 使用 Request.UrlReferrer 保留 url 哈希值

java - 匿名类是否使外部引用保持 Activity 状态?

ruby - Ruby 的 Net::HTTP 在 JRuby 上是线程安全的吗

c# - 如何在循环内而不是从 Razor View 中的模型访问 DisplayName 注释?

asp.net - 无法将 asp.net 中表头中的值居中对齐

javascript - 在 updatePanel 上回发后添加额外的 javascript

java - 使用JAVA线程并发访问hsqldb