WCF - 生成一个新的工作线程并返回调用者而不等待芬兰语

时间:2012-06-19 08:27:55

标签: multithreading wcf

我有一个在IIS中托管的WCF Web服务 - 这个服务有一个方法 - 让我们称之为DoSomething()。从客户端应用程序调用DoSomething()。

DoSomething执行一些工作并将答案返回给用户。现在我需要记录DoSomething被调用的频率。我可以将它添加到DoSomething函数中,以便每次调用都可以写入sql数据库并更新计数器,但这会降低DoSomething方法的速度,因为用户需要等待额外的数据库调用。

让DoSomething方法产生一个新线程是一个很好的选择,它将更新数据库中的计数器,然后只需将DoSomething方法的答案返回给用户而无需等待线程芬兰语?然后我不知道数据库更新是否失败,但这并不重要。

产生新后台线程的任何问题,而不是等待它在WCF中芬兰语?或者有更好的方法来解决这个问题吗?

更新:以稍微不同的方式提问。使用wcf Web服务方法生成新线程是一个坏主意吗?

2 个答案:

答案 0 :(得分:2)

主要问题是可靠性。这是你关心的电话吗?如果IIS进程在您返回响应后崩溃,但在您的线程完成之前,它是否重要?如果不是,那么您可以使用客户端C#工具。如果 重要,那么您必须使用可靠的排队技术。

如果你使用客户端然后产生一个新的线程只是为了阻止数据库调用永远不是正确的答案。您想要的是使调用异步,并在确保在连接上启用SqlCommand.BeginExecute后使用AsyncronousProcessing

如果您需要可靠的处理,那么您可以使用依赖于持久队列的Asynchronous procedure execution这样的模式。

作为附带说明,如果以在每个HTTP请求上写入数据库的天真方法完成,那么诸如日志记录或命中计数等事情是一个巨大的性能瓶颈。你必须批量冲洗。

答案 1 :(得分:1)

如果您只想跟踪服务中的DoSomething()这样的单个方法,那么您可以创建自定义操作行为并将其应用于该方法。

操作行为将包含将信息记录到数据库的代码。在该操作行为中,您可以使用.NET 4.0的新TPL库来创建将负责数据库日志记录的任务。如果您使用TPL,则无需担心直接创建线程。

明天使用操作behvaior的优势你需要跟踪另一种方法然后在那里复制代码而不是复制那里的代码你只是用自定义操作行为来标记方法。如果您想跟踪所有方法,那么您应该寻求服务行为。

要了解有关操作行为的更多信息,请检查http://msdn.microsoft.com/en-us/library/system.servicemodel.operationbehaviorattribute.aspx

要了解有关TPL(任务并行库)的更多信息,请检查http://msdn.microsoft.com/en-us/library/dd460717.aspx