必须处理简单的 CPU 绑定操作的异步方法执行流程

Posted

技术标签:

【中文标题】必须处理简单的 CPU 绑定操作的异步方法执行流程【英文标题】:Async method execution flow that has to deal a simple CPU bound operation 【发布时间】:2020-01-23 04:07:10 【问题描述】:
public class Car
    
        public int TyresCount  get; set; 
        public int SpareTyreCount  get; set; 
        public int FrontTyres  get; set; 
        public int RearTyres  get; set; 
    

    public class CarAssembly
    

        public async Task<Car> Process(Car car)
        
            car = await AssembleFrameAsync(car);
            //Option A
            SetTyreCount(car);
            //or Option B
            SetTireCountNonStatic(car);
            //or Option C
            await Task.Run(() => SetTyreCountAsync(car));
            car = await AssembleEngineAsync(car);
            return car;
        

        public async Task<Car> AssembleFrame(Car car)
        
            car = await httpclient.GetAsync("GetFrame");
            return car;
        

        //Option A
        private static void SetTyreCount(Car car)
        
            car.TyresCount = car.FrontTyres + car.RearTyres;
            car.SpareTyreCount = 1;
        

        //Option B
        public void SetTyreCountNonStatic(Car car)
        
            car.TyresCount = car.FrontTyres + car.RearTyres;
            car.SpareTyreCount = 1;
        

        //Option C
        public void SetTyreCountAsync(Car car)
        
            car.TyresCount = car.FrontTyres + car.RearTyres;
            car.SpareTyreCount = 1;
        
        public async Task<Car> AssembleEngineAsync(Car car)
        
            car = await httpclient.postAsync("assembleEngine");
            return car;
        
    

我有这个类 CarAssembly 有方法 Process,它调用异步方法 AssembleFrame 然后它必须调用另一个方法来GetTyreCount 这是一个非常简单的获取计数的方法,如上所述,上面提到的 3 个选项 OptionA、OptionB、OptionC 是调用这个简单的 CPU 绑定方法的正确方法。即使我所说的选项不正确,请提供您的想法什么是正确的方法。假设它是 WebAPI 中的类执行(无 UI)

【问题讨论】:

为什么要GetTyreCount设置汽车上的数值? 您绝对应该使用Task.Run,除非您调用的方法运行时间很长并且会干扰代码的执行。静态与非静态无关紧要,但由于该方法不使用任何类成员,因此我可能更喜欢静态的那种性质。 不是 A、B 和 C 除了名称是相同的,更好的名称是“SetTireCount”,以及它不是“Async”和 Get,意味着它返回了它不返回的东西(空白)。他们都工作....但为什么有一个静态版本?包装非异步时选项 c 是错误的,所以最正确的是 B 的名称更改为“SetTireCount” 【参考方案1】:

在 WebAPI 上,您应该使用选项 A 或 B。如果您不需要访问实例变量(例如记录器),请使用选项 A。如果你这样做,请使用选项 B。

一般来说,do not use Task.Run on ASP.NET。

【讨论】:

以上是关于必须处理简单的 CPU 绑定操作的异步方法执行流程的主要内容,如果未能解决你的问题,请参考以下文章

CPU子系统

同步 异步 阻塞 非阻塞

同步异步阻塞非阻塞 简析

架构设计 | 异步处理流程,多种实现模式详解

并行处理许多 API 请求与异步/等待 [关闭]

js同步和异步