Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF和执行服务后的较长操作_Wcf_Multithreading - Fatal编程技术网

WCF和执行服务后的较长操作

WCF和执行服务后的较长操作,wcf,multithreading,Wcf,Multithreading,我有一个WCF服务,有很多方法。我想,在执行其中一种方法后,电子邮件将发送给一些用户。发送电子邮件可能是一个长时间运行的操作,我不希望该方法的调用方这次等待。呼叫方应在计算后立即收到响应,并在计算后发送电子邮件。我正在考虑用一个新的线程发送电子邮件,但我不确定在IIS中托管WCF服务时启动新线程是否正确。有人能告诉我在这种情况下最好的做法是什么吗 提前谢谢 Lukasz Glaz < P>在IIS中托管服务时,启动新线程没有本质上的问题,但请考虑如下: 发送电子邮件有多重要 启动后台线程时,无

我有一个WCF服务,有很多方法。我想,在执行其中一种方法后,电子邮件将发送给一些用户。发送电子邮件可能是一个长时间运行的操作,我不希望该方法的调用方这次等待。呼叫方应在计算后立即收到响应,并在计算后发送电子邮件。我正在考虑用一个新的线程发送电子邮件,但我不确定在IIS中托管WCF服务时启动新线程是否正确。有人能告诉我在这种情况下最好的做法是什么吗

提前谢谢
Lukasz Glaz

< P>在IIS中托管服务时,启动新线程没有本质上的问题,但请考虑如下:

发送电子邮件有多重要

启动后台线程时,无法保证进程在操作完成之前不会崩溃。在最坏的情况下,机器可能只是因为外部原因而崩溃——断电、蓝屏死机等等,而你真的无法阻止这种情况发生。在这种情况下,或者在不太严重的情况下,线程可能永远无法完成其操作,这意味着电子邮件永远不会发送

如果你能接受,从一个新的线程发送电子邮件就可以了

另一方面,如果您必须保证始终发送电子邮件,则需要将该操作移交给某种类型的事务队列(MSMQ、数据库表或其他事务机制)


在这种情况下,您需要另一个强大的后台进程,Windows服务会将消息从队列中拉出来并发送电子邮件。这种体系结构保证电子邮件最终会被发送,即使服务器突然重新启动。但是,这是一个复杂得多的设置,因此我认为只有当要求声明必须发送电子邮件时,才应该实现它。

您也可以进行操作,这样客户端就不会等待操作的结果。在我看来,这将是一个正确的选择,因为你根本不关心邮件操作失败的结果,等等。。。。如果您想确保交付,您必须为您的服务配置可靠性。

需要计算响应并将其发送回呼叫方,因此在这种情况下,单向不是一个好主意。电子邮件只是一个附加通知,因此不需要更复杂的解决方案。关于启动线程:我应该创建一个新的线程实例还是使用线程池?我可以补充一点,需要发送电子邮件的方法每天调用的次数不多。除非您明确需要对线程的引用,否则线程池会很好地工作-它应该是您启动新线程的第一选择,至少在.NET 4之前,除非您需要更多的控制。然而,由于它不经常被调用,它可能并不重要。。。