【问题标题】:WCF REST - Is it possible to return response without ending the execution?WCF REST - 是否可以在不结束执行的情况下返回响应?
【发布时间】:2016-09-17 07:49:51
【问题描述】:

您很可能会明白,我一般对异步操作不是很有经验(仅使用 Android 的 AsyncTask)。

这是 WCF REST POST 方法的概要;我将使用这张图片来解释我想要实现的目标。

FirstJob 将一些内容保存到数据库中。

SecondJob 读取保存在数据库中的内容并对数据进行一些处理。

客户端不关心 SecondJob 中发生了什么,只想接收来自 FirstJob 的响应。

所以这两个作业不需要并行运行,因为 SecondJob 依赖于 FirstJob;理想情况下,SecondJob 将在单独的线程/上下文(?)或类似的情况下运行。

据我所知,第二个作业确实在单独的线程中开始,在第二个作业运行时执行到达 return 语句,但请求在 SecondJob 完成之前不会结束。

【问题讨论】:

    标签: c# multithreading wcf rest asynchronous


    【解决方案1】:

    我个人会将第二个作业视为单独的 POST 操作,并从控制器调用第二个作业 POST。控制器是第一个作业的控制器,可以从第一个作业返回正确的状态;它只是碰巧在执行此操作时将 POST 调用到第二个端点。

    这种方法的好处是第二个作业甚至不需要在同一个 IIS 上(在 NLB 场中它可以在任何地方),因此您可以免费获得负载平衡。或者,“第二个作业服务器”可以位于仅为此类后台处理任务保留的特定 URL 上。

    【讨论】:

    • 感谢您的回答。我也考虑过这种方法,但这里的问题是第二个工作可能会影响多个用户,我不想依赖客户端在收到响应后发出第二个请求。我需要让 SecondJob 以更可靠的方式开始。
    • 我并不是建议客户端应用程序启动第二个工作 - 我建议由第一个工作调用的控制器本身启动第二个 POST。客户不必知道第二个工作需要开始 - 它只是自动的。
    • 哦,我明白了。我会试试看的。
    【解决方案2】:

    我建议你不要依赖 IIS 来处理你的后台任务,因为它可以在不等待的情况下关闭它。我建议您创建一个 Windows 服务应用程序,该应用程序将通过另一个 WCF 绑定或数据库请求或其他方式接受第二个作业的请求。

    正如@PhillipH 所说,您可以通过控制器的另一个请求获得第二个作业的结果。

    【讨论】:

      【解决方案3】:

      我最初尝试做的事情实际上是在工作,但是 Visual Studio 调试器愚弄了我。我在没有调试器的情况下再次进行了测试,但是使用了 Tread.Sleep(60000) 并且看起来它的行为符合预期。 api 调用返回响应后,SecondJob 继续在后台运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-10-30
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多