繁体   English   中英

任务开始运行需要几秒钟的时间

[英]It takes more than a few seconds for a task to start running

我正在使用WPFC#开发应用程序。 我有以下代码:

        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秒钟以上的时间才能开始执行(一旦开始执行,照常执行即可)。

我不明白为什么任务要花这么长时间才能开始运行? 我能以某种方式影响任务优先级,以便它在所有情况下立即开始运行吗? 我猜(仅是一个假设)任务由任务调度程序调度以在以后执行? 有没有办法让我强制任务始终一直运行?

任务是在线程池上调度的(默认情况下)。 如果还有许多其他任务/线程池使用情况(尤其是正在创建长时间运行的任务但未将其标记为此类),则线程池可能需要一段时间才能扩展,以使线程可用于执行新排队的线程项目。

因此,我将整体上看待您的系统,看看您是在线程池中投入过多的工作还是不恰当地使用它。

我能以某种方式影响任务优先级,以便它在所有情况下立即开始运行吗?

好了,您可以手动创建线程并接管所有使用,但请注意,即使在这里也不是“立即”的。 这与操作系统选择调度任何新创建的线程一样快。

或者,如果您确实需要“立即”运行的代码,请在您已经知道已计划并正在运行的线程上运行它-您自己的当前线程。 当然,您将失去要求TPL处理任务并在完成时得到通知的优势。 并可能捆绑诸如UI之类的宝贵线程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM