【问题标题】:C#: Using async on a post APIC#:在发布 API 上使用异步
【发布时间】:2021-04-05 12:25:00
【问题描述】:

创建了一个 POST API,它基本上将文件保存在一个目录中。

当来自客户端的多个请求时,异步代码是否会使我的 API 更好地处理可伸缩性?

目前,代码同步工作。

我应该让每个方法都异步吗?我应该把关键字 await 放在哪里?

任务:

任务 1:读取请求内容 (XML)

任务 2:如果尚未创建目录,请创建目录

任务 3:使文件名独一无二

将文件保存到目录

  [System.Web.Mvc.HttpPost]
    public IHttpActionResult Post(HttpRequestMessage request)
    {
        try
        {
            string contentResult = string.Empty;
            ValidateRequest(ref contentResult, request);
            //contentResult = "nothing";
            //Validation of the post-requested XML 
            //XmlReaderSettings(contentResult);
           
            using (StringReader s = new StringReader(contentResult))
            {
                doc.Load(s);
            }

            string path = MessagePath;

            //Directory creation
            DirectoryInfo dir = Directory.CreateDirectory($@"{path}\PostRequests");
            
            string dirName = dir.Name;

            //Format file name
            var uniqueFileName = UniqueFileNameFormat();

            doc.Save($@"{path}\{dirName}\{uniqueFileName}");
        }
        catch (Exception e)
        {
            LogService.LogToEventLog($"Error occured while receiving a message from messagedistributor: " + e.ToString(), System.Diagnostics.EventLogEntryType.Error);
            throw e;
        }
        LogService.LogToEventLog($"Message is received sucessfully from messagedistributor: ", System.Diagnostics.EventLogEntryType.Information);
        return new ResponseMessageResult(Request.CreateResponse((HttpStatusCode)200));
    }

【问题讨论】:

    标签: c# api post async-await task


    【解决方案1】:

    是的,应该的。

    当您将异步与网络或 IO 调用一起使用时,您不会阻塞线程,它们可以被重用于处理其他请求。 但是,如果您只有一个驱动器而其他客户端执行相同的工作 - 您将不会获得速度优势,但使用异步调用仍会改善整个系统的健康状况。

    【讨论】:

    • 我已经更新了我的问题。如何使它们相互依赖的任务异步?
    • 除非系统遇到线程耗尽,否则您不会在异步/等待期间获得速度优势。暗示 async/await 提供延迟改进可能不是您的意图,但这就是它的读取方式。
    • @DavidL 所以你的意思是我不应该在上面列出的每项任务上将此解决方案更改为异步解决方案?我刚刚读到异步将适合 API,这就是为什么我想到将代码更改为异步
    • @Motivizer 根本没有。但是,重要的是要了解,在每次调用的基础上,由于异步状态机的创建方式,延迟会增加很小(并且可能是不明显的量)。也就是说,您在整个应用程序中获得了可观的吞吐量优势,并且随着负载被应用到您的 api,您的应用程序和底层系统都将更加健康。
    • 好的,谢谢回复。我的目的是使用一个异步 API 来处理大量吞吐量来处理请求。我正在使用 WebSurge 进行负载测试,似乎需要很长时间才能进行一些 api 调用。当我使用同时运行的两个线程进行负载测试时,我收到有关该进程被另一个进程使用的错误。 async 不应该处理这种错误吗?
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多