C# 将web服务中的线程分隔在它之后';完成了

C# 将web服务中的线程分隔在它之后';完成了,c#,multithreading,web-services,.net-2.0,asmx,C#,Multithreading,Web Services,.net 2.0,Asmx,如果在我道歉之前问过这个问题,并且这是.NET 2.0 ASMX Web服务,那么我再次道歉=D 仅公开web服务的.NET应用程序。每天大约有1000万条消息在多个IIS服务器之间进行负载平衡。每个传入消息都是XML,传出消息都是XML。(XMLElement)(我们已经有了运行在类固醇上的强大服务器) 我有一个SLA,所有消息都在X秒内处理 这个过程中的一个函数,Linking Methods,现在需要10-20秒,它是每个事务所必需的,但是在web服务返回结果之前发生它并不重要。正因为如此

如果在我道歉之前问过这个问题,并且这是.NET 2.0 ASMX Web服务,那么我再次道歉=D

仅公开web服务的.NET应用程序。每天大约有1000万条消息在多个IIS服务器之间进行负载平衡。每个传入消息都是XML,传出消息都是XML。(XMLElement)(我们已经有了运行在类固醇上的强大服务器)

我有一个SLA,所有消息都在X秒内处理

这个过程中的一个函数,Linking Methods,现在需要10-20秒,它是每个事务所必需的,但是在web服务返回结果之前发生它并不重要。正因为如此,我建议将它放到另一个线程上,但现在我意识到,我的话和他们背后热切的开发人员可能还没有充分考虑到这一点

下面的示例显示了左侧的电流。在右边,正在尝试什么

实际上,我想要的是让一个web服务产生一个长时间运行(10-20秒)的线程,即使在web服务完成后也会执行

实际上,这就是正在发生的事情:

        Thread linkThread= new Thread(delegate()
        {
            Linkmembers(GetContext(), ID1, ID2, SomeOtherThing, XMLOrSomething);
        });
        linkThread.Start();
使用这一点,我们在开发设备上的时间从19秒减少到了2.1秒,这是相当可观的

我担心,随着我们获得的流量的增加,如果供应商/外部团体决定限制我们,IIS可能会在处理完这些线程之前决定回收/杀死这些线程。我同意我们的解决方案可能不是“最好的”,但我们没有时间构建队列系统或其他Windows服务来处理这个问题

有更好的方法吗?有什么需要考虑的注意事项吗


谢谢。

除了您描述的问题,我想不出任何问题。也就是说,有一些解决问题的方法不需要从头开始构建自己的解决方案

使用:创建具有MSMQ端点的WCF服务(只要已启用,则无需使用windows服务),并从ASMX服务中调用该服务。您可以获得可靠排队的所有好处,而无需构建自己的队列


另外,如果您的MSMQ服务失败或引发异常,它将自动重新处理。如果使用DTC并访问数据库,甚至可以将MSMQ事务流发送到数据库。

是否只需要计算响应时间?与响应时间无关。我需要在web服务中调用一个长时间运行(10-20秒)的进程,我不希望该进程在web服务完成后停止。我认为您正在执行唯一的解决方案。这有点无关紧要,但在实现这样的系统时,请确保生成的线程中没有任何未捕获的异常。未捕获的异常将使线程继续运行并最终消耗您的资源,但您不会立即看到功能上的更改,因为失败现在发生在主进程之外。添加队列是我研究过的一个选项。它的风险更低,给了我们更好的任务管理和更好的管理能力。感谢您的投入