首页 文章

Web服务在仍处理线程时响应调用者

提问于
浏览
3

I am creating a web service
在Web服务中,我做了一些非常快速的处理,我使用SmtpClient.SendAsync()异步发送2到3封电子邮件 .

我的问题是,即使它们是异步发送的,我也必须等待它们完成处理才能结束服务并向用户发回响应 . 如果我不等待SendCompletedEventHandler触发,则永远不会发送电子邮件 . 有时邮件服务器需要一些时间来响应 .

用户实际上不需要知道是否发送了电子邮件 . 发送电子邮件并让它们在其他地方处理并尽可能快地响应用户将是一件好事 .

有人会有一个很好的解决方案吗?也许我写错了我的搜索但是我没有提出任何解决方案 .

2 回答

  • 0

    您可以启动一个新线程来执行发送:

    ThreadPool.QueueUserWorkItem(delegate {
        SmtpClient client = new SmtpClient();
        // Set up the message here
        using (MailMessage msg = new MailMessage()) {
            client.Send(msg);
        }
    });
    
  • 1

    这是我已经测试并使用WCF的完整示例 . 控制立即返回给客户端,服务器开始发送,睡眠模拟延迟,然后完成 . 只需添加对System.ServiceModel的引用即可获取必要的类 .

    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(HelloWorldService), new Uri("http://localhost:3264"));
            ServiceMetadataBehavior mdb = new ServiceMetadataBehavior();
            mdb.HttpGetEnabled = true;
            host.Description.Behaviors.Add(mdb);
            host.Open();
    
            Console.WriteLine("Service Hosting...");
            Console.ReadLine();
        }
    }
    
    [ServiceContract]
    class HelloWorldService
    {
        [OperationContract]
        public void SendEmails()
        {
            Task.Factory.StartNew(() =>
            {
                Console.WriteLine("Start Sending Emails...");
                Thread.Sleep(10000);
                Console.WriteLine("Finish Sending Emails...");
            });
        }
    }
    

    }

相关问题