Запуск задачи занимает более нескольких секунд

Я разрабатываю приложение, используя 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 секунд (как только она начинается, выполнение выполняется быстро, как обычно).

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


person DimaK    schedule 19.11.2018    source источник
comment
Итак, если я запущу этот пример, я должен увидеть вашу проблему? если нет (и я уверен, что не буду), это означает, что вам не хватает соответствующей информации, что это за консоль, приложение, серверное приложение, много ли задач происходит и т. д. и т. д.   -  person TheGeneral    schedule 19.11.2018
comment
Если есть очень конкретная часть вашего кода (не все), которую вы хотите намекнуть на то, что вы не хотите, чтобы она задерживалась, рассмотрите возможность использования LongRunning. Это своего рода злоупотребление, но оно, скорее всего, сработает. docs.microsoft. com/en-us/dotnet/api/   -  person mjwills    schedule 19.11.2018


Ответы (1)


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

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

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

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

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

person Damien_The_Unbeliever    schedule 19.11.2018