【问题标题】:Async method execution flow that has to deal a simple CPU bound operation必须处理简单的 CPU 绑定操作的异步方法执行流程
【发布时间】: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”

标签: c# webapi


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多