Task的使用注意事项

Task是基于线程池的封装。Task进行异步操作就是从线程池中获取线程进行操作。

内部调度机制TaskScheduler

ThreadPoolTaskScheduler

Task的默认机制,任务在ThreadPool上执行;如果当前Task上的TaskCreationOptions设置为LongRunning的话,这个task就会委托到Thread中去执行。

SynchronizationContextTaskScheduler

同步上下文的调度器,原理就是把繁重的耗时工作丢给ThreadPool,然后将更新UI的操作丢给 UI线程的队列中,由UIThread来执行。

自定义调度器

ContinueWith

在有时候使用 Task 的 Delay 之后想要返回主线程

Task.Delay(TimeSpan.FromSeconds(5)).ContinueWith
(
    _ => Foo()
    // 如果 Foo 不需要操作UIThread,可以注释下面一段代码提高效率
    , TaskScheduler.FromCurrentSynchronizationContext()
);