【问题标题】:Calling method async from WCF service and return immediately从 WCF 服务调用异步方法并立即返回
【发布时间】:2016-03-17 22:46:21
【问题描述】:

第三方正在调用我们的 WCF 服务。调用者希望在很短的时间内确认发送的记录已被接收和存储。

存储的记录需要一些冗长的处理。是否可以在存储记录后立即异步执行处理,以便立即发送确认?

当然可以有一个单独的进程来进行处理,但问题是我是否可以在不超时的情况下将存储和处理结合起来。

更新:
看起来这样可行:

var aTask = new Task(myService.TheMethod);
aTask.Start();

return aVariableAsync;

或者在我的 WCF 主机中这样做是一个非常糟糕的主意,因为......?

【问题讨论】:

    标签: c# wcf parallel-processing task-parallel-library


    【解决方案1】:

    您可以在 OperationContract 属性上将“AsyncPattern”设置为 true,如 on MSDN 所述。

    然后您可以使用服务方法上的以下属性来控制并发:

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

    【讨论】:

    • 我不需要调用异步服务,我希望从服务内部进行异步调用。调用者是第三方,具有“一成不变”的同步服务调用。
    【解决方案2】:

    是的,它可以做到。我没有大量的经验,但这是一些代码的 sn-p 显示。服务在将 xml 消息保存到硬盘驱动器的控制器上调用此方法,然后启动一个单独的任务以将其处理到 MongoDB 中并将一条消息返回给已成功保存的服务。

        public string SaveTransaction(XElement pTransactionXml, string pSavePath)
        {
    
            //save the transaction to the drive locally
            pTransactionXml.Save(pSavePath);
    
            ...
    
            var mongoTask = Task.Run(async () =>
            {
                await SendXMLFilesToMongo(pSavePath);
            });
    
            return response.WithResult("Successfully saved to disk.");
        }
    
    
    
        public virtual async Task<int> SendXMLFilesToMongo(string pSavePath)
        {
             //call the code to save to mongo and do additional processing
        }
    

    【讨论】:

    • 但我希望服务立即返回,而不是等待任务完成。因此,回答“成功保存到磁盘”。不可能。答案可能是“我们成功保存了您的请求,我们承诺它将被处理”。
    • 这部分说要开始一个新任务并异步运行var mongoTask = Task.Run(async () =&gt;
    猜你喜欢
    • 2014-04-30
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多