必须处理简单的 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 绑定操作的异步方法执行流程的主要内容,如果未能解决你的问题,请参考以下文章