代码之家  ›  专栏  ›  技术社区  ›  Niels Bosma

.NET:三重API调用

  •  2
  • Niels Bosma  · 技术社区  · 15 年前

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

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

    我已经向卖主投诉过了,但他们很差劲,我很肯定他们不会对此采取任何行动。

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Ed Power    15 年前

    我将在数据库表中对电子邮件进行排队,并生成一个单独的Windows服务,该服务从表中读取并为每个电子邮件生成一个线程,最高可达某个最大线程限制。数据库还可以用来捕获吞吐量时间。

    您还应该了解您的供应商可以同时处理多少Web服务请求。在邮件中自己密件抄送,以确定在你的终端上同时提交的内容是否会以单线程传输的方式结束。也许开始为这个供应商的替代品购物(你说他们很烂)。

    如果你想从你自己的服务器中获得乐趣并卸载你的努力,你就把一批电子邮件发送到云服务(Amazon WebServices,微软Azure,或者谷歌App Server),并在云上产生一个过程,同时向你的供应商喷发电子邮件。

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

        2
  •  3
  •   Spencer Ruport    15 年前

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

        3
  •  1
  •   jkchong    15 年前

    我取得了一些成功 ThreadPool.QueueUserWorkItem() 对于ASP.NET应用程序。你可以在谷歌上搜索一些使用示例。

        4
  •  0
  •   Wim Coenen    15 年前

    不需要自己生成线程。班级 generated by visual studio 访问Web服务已经包含异步方法。对于每个WebService调用 ,您将看到 BeginFoo EndFoo 方法。这个 开始软件 方法将立即返回 IAsyncResult 对象,而WebService调用是在另一个线程中完成的。

    参见 this MSDN topic 有关如何使用的详细信息 IAsyncResult .