【问题标题】:How do I keep a task alive after the method that called it has exited?在调用它的方法退出后,如何让任务保持活动状态?
【发布时间】:2014-06-03 07:50:46
【问题描述】:

我正在编写一个 web 服务,它通过存储过程将长时间运行的批量插入命令发送到 sql db。我不希望 Web 服务在等待来自数据库的响应时挂起,所以我只想返回一个 http 响应,让客户端知道在我开始任务后请求已发送到数据库。但是一旦我返回响应,任务就会失去上下文并被丢弃,对吗?我应该如何保持这个生命?

【问题讨论】:

    标签: c# multithreading web-services task-parallel-library asp.net-web-api


    【解决方案1】:

    一般来说,从 IIS 中剥离一些东西来做工作并不是一个好主意。如果 AppPool 重启会发生什么?如果出现异常怎么办?

    相反,我建议编写一个 Windows 服务并让它负责这项工作。

    根据您的 cmets,我会看看您是否可以要求以下要求(理论上):

    所有外部调用都是通过网络服务完成的。 Web 服务使用单独的程序集进行实际数据访问。

    一个单独的 Windows 服务用于长时间运行的进程,它也将使用与 Web 服务相同的数据访问程序集。

    这确实是最好的方法(但根据要求不一定可行)。

    【讨论】:

    • 不幸的是,我被告知所有通信都必须通过网络服务。我无法与数据库进行任何直接通信。顺便说一句,你既聪明又正确。
    • @WillMartin 通过网络服务很好。让 Web 服务接收请求,将其提供给 Windows 服务,然后让它在那里处理。
    • Windows 服务仍然需要打开一个 sql 连接并调用存储的 proc,对吧?它仍然是与无法通过 Web 服务调用工作的数据库直接通信。
    • 你遇到了一个问题 22。长的 DB 调用应该(在我看来)永远通过 IIS,你是在自找麻烦。但似乎您需要强制所有数据库调用(内部和外部)通过网络服务?就个人而言,我认为这是一个深思熟虑的要求。
    【解决方案2】:

    我认为这更像是一个架构问题,而不仅仅是维护“上下文”。谈到架构,我认为 WCF Web 服务会在您的场景中有所帮助。

    您需要的是带有回调合同的服务。服务接受请求,返回确认,存储客户端上下文(用于回调),并在后台触发长时间运行的数据库任务。当任务完成时,它会读取客户端上下文并使用结果调用回调处理程序。

    MSDN 的这篇文章建议了如何在 webservice 中做一个回调合约。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-22
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 2017-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多