我正在使用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秒钟以上的时间(一旦开始执行,执行起来就和往常一样快)。
我不明白为什么任务要花这么长时间才能开始运行?我能以某种方式影响任务优先级,以便它在所有情况下立即开始运行吗?我猜(仅是一个假设)任务由任务调度程序调度以在以后执行?我有办法强迫任务始终一直运行吗?
答案 0 :(得分:2)
任务是在线程池上调度的(默认情况下)。如果还有许多其他任务/线程池使用情况(尤其是正在创建长时间运行的任务但未将其标记为此类),则线程池可能需要一段时间才能扩展,以使线程可用于执行新排队的线程项目。
因此,我将整体上看待您的系统,看看您是在线程池中投入过多的工作,还是使用不当。
我可以以某种方式影响任务优先级,因此它将在所有情况下立即开始运行吗?
好吧,您可以手动创建线程并接管所有使用,但请注意,即使在这里也不是“立即”的。这与操作系统选择计划任何新创建的线程一样快。
或者,如果您确实需要代码“立即”运行,请在您已经知道已计划并正在运行的线程上运行它-您自己的当前线程。当然,您将失去要求TPL处理任务并在完成时得到通知的优势。并可能捆绑诸如UI之类的宝贵线程。