Asyn c поток выполнения метода, который должен выполнить простую связанную с CPU операцию - PullRequest
0 голосов
/ 23 января 2020
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 , который имеет метод Процесс , который вызывает асинхронный c метод AssembleFrame , а затем он должен вызвать другой метод для GetTyreCount , который является очень простым методом для получения счетчика, как упомянуто выше с указанными выше тремя опциями OptionA, OptionB, Option C, который является правильным способом вызова этого простого метода, связанного с процессором. Даже если варианты, которые я изложил, не верны, пожалуйста, поделитесь своими мыслями, каков правильный подход. Предположим, что это выполнение класса в WebAPI (без пользовательского интерфейса)

1 Ответ

0 голосов
/ 23 января 2020

В WebAPI вы должны использовать опции A или B. Используйте опцию A, если вам не нужен доступ к переменным экземпляра (например, регистратору). Используйте опцию B, если вы это делаете.

Как правило, не используйте Task.Run для ASP. NET.

...