3

我正在创建一个 Web 服务
在 Web 服务内部,我做了一些处理,这非常快,我使用 SmtpClient.SendAsync() 异步发送 2 到 3 封电子邮件。

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

用户实际上并不需要知道电子邮件是否已发送。最好只发送电子邮件并让他们在其他地方处理并尽快回复用户。

有人会对此有一个好的解决方案吗?也许我的搜索措辞错误,但我没有提出任何解决方案。

4

2 回答 2

1

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

ThreadPool.QueueUserWorkItem(delegate {
    SmtpClient client = new SmtpClient();
    // Set up the message here
    using (MailMessage msg = new MailMessage()) {
        client.Send(msg);
    }
});
于 2012-08-17T00:20:40.603 回答
0

这是我已经测试并使用 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...");
        });
    }
}

}

于 2012-08-17T07:12:01.047 回答