.Net:Threadify重度API调用

时间:2009-10-22 16:14:29

标签: c# asp.net multithreading

我有一个电子邮件队列,其中包含要发送的电子邮件。 Web服务调用SOAP Web服务,逐个处理队列。

我们使用他们的REST API使用外部供应商发送电子邮件。我的问题是调用此API可能需要0.1毫秒到12秒。我们向订阅我们通知的客户发送了数千封电子邮件,重要的是,在每个批次中,第一个与队列中的最后一个相比没有太多延迟(理想情况下,它们将同时发送)。

我向供应商抱怨但是因为他们很糟糕我很确定他们不会对此做任何事情。

我可以以某种方式Threadify这个过程,实例化同时调用服务器?服务器也是我的网络服务器所以我不能使用所有的果汁。有多少线程是合适的?这是一个好主意吗?一般管理这些线程的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

您不应该在ASP.Net应用程序中创建线程。如果你有足够大的队列来保证多线程,你应该创建一个Windows服务来处理队列。

答案 1 :(得分:1)

对于ASP.NET应用,我在ThreadPool.QueueUserWorkItem()方面取得了一些成功。您可以谷歌搜索一些使用示例。

答案 2 :(得分:1)

我会将电子邮件排入数据库表并生成一个单独的Windows服务,该服务从表中读取并为每封电子邮件生成一个线程,最多可达一些最大线程限制。该数据库还可用于捕获吞吐量时间。

您还应该了解供应商可以同时处理的Web服务请求数量。 BCC自己查看电子邮件,了解您的最终同时提交是否最终作为单线程传输。也许开始购买这个供应商的替代品(你说他们很糟糕)。

如果您希望从您自己的服务器获得幻想和卸载工作,您可以将一批电子邮件发送到云服务(Amazon Web Services,Microsoft Azure或Google App Server),并在云上生成一个流程以进行喷涂同时向您的供应商发送电子邮件。

您也可以直接从云端发送电子邮件,至少可以通过亚马逊发送。它们提供了默认限制,但接下来是关于如何删除限制的链接:http://aws.amazon.com/contact-us/ec2-email-limit-request/

答案 3 :(得分:0)

不需要自己生成线程。访问Web服务的类generated by visual studio已包含异步方法。对于每个Web服务调用 Foo ,您将看到有BeginFooEndFoo方法。在另一个线程中完成webservice调用时,BeginFoo方法将立即返回IAsyncResult对象。

有关如何使用IAsyncResult的详细信息,请参阅this MSDN topic