任务启动需要几秒钟以上 运行
It takes more than a few seconds for a task to start running
我正在使用 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会立即启动运行ning,不到一秒后,CODE_B开始执行。
但是,有时 Task.Factory.StartNew
创建的任务需要 5 秒以上才能开始(一旦开始,执行速度和往常一样快)。
我不明白为什么任务启动需要这么长时间运行ning?我能否以某种方式影响任务优先级,使其在所有情况下都立即启动 运行ning?我猜(这只是一个假设)任务是由任务调度程序安排的,稍后执行?有没有办法让我一直强制任务立即运行?
任务在线程池上安排(默认)。如果有很多其他 tasks/thread 池使用(特别是如果正在创建长 运行ning 任务但未标记为此类),线程池可能需要一段时间才能扩展,以便线程可用于执行新排队的项目。
所以,我会从整体上审视您的系统,看看您是在线程池中投入了过多的工作还是使用不当。
Can I somehow influence the task priority, so it would start running immediately in all scenarios?
好吧,您可以手动创建线程并接管所有使用,但请注意,即使在那里它也不是 "immediate"。它与 OS 选择安排任何新创建的线程一样快。
或者,如果您确实需要 运行 "immediately" 的代码,运行 它在您已经知道已安排的线程上并且 运行ning - 您自己的当前线程.当然,这样您就失去了要求 TPL 处理任务并在任务完成时收到通知的优势。并可能捆绑一条珍贵的线,例如 UI 线。
我正在使用 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会立即启动运行ning,不到一秒后,CODE_B开始执行。
但是,有时 Task.Factory.StartNew
创建的任务需要 5 秒以上才能开始(一旦开始,执行速度和往常一样快)。
我不明白为什么任务启动需要这么长时间运行ning?我能否以某种方式影响任务优先级,使其在所有情况下都立即启动 运行ning?我猜(这只是一个假设)任务是由任务调度程序安排的,稍后执行?有没有办法让我一直强制任务立即运行?
任务在线程池上安排(默认)。如果有很多其他 tasks/thread 池使用(特别是如果正在创建长 运行ning 任务但未标记为此类),线程池可能需要一段时间才能扩展,以便线程可用于执行新排队的项目。
所以,我会从整体上审视您的系统,看看您是在线程池中投入了过多的工作还是使用不当。
Can I somehow influence the task priority, so it would start running immediately in all scenarios?
好吧,您可以手动创建线程并接管所有使用,但请注意,即使在那里它也不是 "immediate"。它与 OS 选择安排任何新创建的线程一样快。
或者,如果您确实需要 运行 "immediately" 的代码,运行 它在您已经知道已安排的线程上并且 运行ning - 您自己的当前线程.当然,这样您就失去了要求 TPL 处理任务并在任务完成时收到通知的优势。并可能捆绑一条珍贵的线,例如 UI 线。