继续在火中忘记?

时间:2014-12-13 16:14:09

标签: c# asp.net-web-api async-await

我有多个异步方法都可以对其他服务器进行httpclient调用。我想在webapi调用结束时运行这些并立即返回。调用需要每个记录它们所花费的时间以及当所有完成时,我需要将这些时间记录到文件中。我花了一段时间修修补补,直到我开始工作,但我不知道它为什么会起作用,而其他方式也没有。

你能为我解释一下吗?

这是没有工作的基本方式。也就是说,调用了,但LogTimeTaken没有(或者至少没有写日志文件)。

//inside webapi action
        var tasks = new List<Task>
                            {
                                MakeCall1Async(data,timeTaken),
                                MakeCall2Async(data, timeTaken),
                                MakeCall3Async(data, timeTaken)
                            };
                            Task.Run(async () =>
                            {
                                await Task.WhenAll(tasks);
                                LogTimeTaken(timeTaken);
                            });
    //finish webapi action and return

以下是开展工作的方式:

    //inside webapi action
Task.Run(async () =>
                    {
                        var tasks = new List<Task>
                        {
                            MakeCall1Async(data, timeTaken),
                            MakeCall2Async(data, timeTaken),
                            MakeCall3Async(data, timeTaken)
                        };
                        await Task.WhenAll(tasks).ContinueWith(t => LogTimeTaken(timeTaken));
                    });
//finish webapi action and return

为什么?

此外,我知道使用火灾和忘记webapi内部的风险,并且它不会总是运行完成(就像应用程序池回收时)。在这种情况下,95%+就足够了。

修改

我了解每个人对技术选择的担忧。我可能正在更改为pub / sub体系结构或使用QueueBackgroundWorkItem。鉴于我只需要95%的时间成功完成,我认为按照我的方式运行它很好。我想要得到的真正答案是为什么第一种方式失败而第二种方式成功写入日志。

1 个答案:

答案 0 :(得分:0)

您应该查看后台作业计划程序,例如hangfireQuartz.net

以下是关于这些解决方案的精彩博客文章。

How to run Background Tasks in ASP.Net