Чтобы запустить задачу, требуется больше нескольких секунд - PullRequest
0 голосов
/ 19 ноября 2018

Я разрабатываю приложение, используя WPF и C#.У меня есть следующий код:

        var tokenSource = new CancellationTokenSource();
        CancellationToken token = tokenSource.Token;
        Task task = Task.Factory.StartNew(() =>
        {
            // Some action that returns a boolean - **CODE_A**
        }).ContinueWith((task2) =>
        {
                result= task2.Result;
                if (!result)
                {
                    //Another action **CODE_B**
                }
            });

        }, token);

Обычно CODE_A начинает работать немедленно, и менее чем через секунду, CODE_B начинает выполняться.

Но иногда требуется, чтобы задание, созданное с Task.Factory.StartNew более 5 секунд, начиналось (как только оно началось, выполнение выполнялось быстро, как обычно).

Я не понимаю, почему это занимает так много времени длязадача запустить?Могу ли я как-то повлиять на приоритет задачи, чтобы он сразу запустился во всех сценариях?Я думаю (это только предположение) задача запланирована планировщиком задач для выполнения позже?Есть ли способ заставить меня запускать задачу все время?

1 Ответ

0 голосов
/ 19 ноября 2018

Задачи запланированы в пуле потоков (по умолчанию). Если существует много других задач / использование пула потоков (и особенно, если долго выполняющиеся задачи создаются, но не помечаются как таковые), для масштабирования пула потоков может потребоваться некоторое время, чтобы поток был доступен для выполнения новой очереди пункт.

Итак, я бы посмотрел на вашу систему в целом и выяснил, вкладываете ли вы слишком много работы в пул потоков или используете ее ненадлежащим образом.

Могу ли я как-то повлиять на приоритет задачи, чтобы он сразу запустился во всех сценариях?

Что ж, вы можете вручную создавать потоки и контролировать все случаи использования, но имейте в виду, что даже там это не является "немедленным". Это так же быстро, как ОС выбирает для планирования любой вновь созданный поток.

Или, если вам действительно нужен код для запуска «немедленно», запустите его в потоке, который, как вы уже знаете, запланирован и выполняется, - в вашем текущем потоке. Конечно, тогда вы теряете преимущество запроса TPL для выполнения задачи и просто получаете уведомление, когда она будет выполнена. И возможно связать драгоценную нить, такую ​​как пользовательский интерфейс.

...