如何在另一个线程/任务中正确调用大逻辑?

时间:2018-01-28 15:03:31

标签: c# .net multithreading wcf task-parallel-library

这是我的问题,我有一个WCF项目,实际上并不重要,因为它更多的是关于C#/ .NET我相信。在我的WCF服务中,当客户端是requestinq时,我对其中一个方法进行了输入验证,如果成功,我就开始进行一些业务逻辑计算。我想在另一个线程/任务中启动这个逻辑,所以在输入验证后我可以立即返回响应。它是这样的:

XXXX MyMethod(MyArgument arg)
{
     var validation = _validator.Validate(arg);
     if (validation.Succeed)
     {
         Task.Run(() => businessLogic())
     }    

     return MyResponseModel();
}

我需要这样做,因为我的buesinessLogic最终可能需要很长时间的计算和数据库保存,但请求服务的客户必须立即知道模型是否正确。

在我将在后台线程中运行的businessLogic计算/保存中,如果出现故障并将其保存在数据库中,我必须捕获异常。 (它的相当大的逻辑可以抛出很多异常,例如在计算器中将对象保存在数据库中之后,如果数据库脱机,则可以抛出保存错误)

如何正确实施/用于此类要求?我只是考虑使用Task.Run并调用动作事件中的所有逻辑是一个好习惯吗?

1 个答案:

答案 0 :(得分:1)

你可以这样做。

但请注意,工作进程可以随时退出。在这种情况下,杰出的工作将会丢失。也许您应该将工作排队到消息队列中。

此外,如果任务"崩溃"我们不会以任何方式通知您。实现自己的错误记录。

此外,您可以像这样生成的任务数量没有限制。如果处理太慢,则会有更多的工作排队。如果您知道服务器不会过载,这可能根本不是问题。

有人建议Task.Run将使用线程,因此不会扩展。这不一定是这样。通常,任何处理的瓶颈都不是线程数,而是使用的后端资源(数据库,磁盘,服务......)。即使使用数百个线程也不会成为瓶颈。 Async IO不是一种解决后端资源限制的方法。