标签:
FCL提供了两个派生子TaskScheduler的类型:线程池任务调度器(thread pool task scheduler),和同步上下文任务调度器(synchronization context task scheduler)。默认情况下都使用线程池任务调度器。
通过TaskScheduler的静态Default属性获得默认任务调度器的引用。
线程池永远不应该设置最大线程数,因为可能发生饥饿。虽然CLR提供了相关函数——ThreadPool静态方法(强烈不建议调用):GetMaxThreads,SetMaxThreads,GetMinThreads,SetMinThreads和GetAvailableThreads。
CLR线程数的默认值大约是1000个线程,基本可以认为是无限制。因为在32位进程最大用户空间为2GB,加载完Win32和CLR等DLLs后,大约剩余1.5GB地址空间。每个线程都需要超过1MB的内存(用户模式栈,线程环境块TEB),所以最多大约有1360个线程。试图创建更多会抛出OutOfMemoryException。64位的进程提供8TB地址空间,理论上可以创建千百万个线程。

同步上下文任务调度器适合提供图形用户界面的应用程序。比如Form,WPF,Silverlight和Windows Store。它将所有任务都调度给GUI线程,使任务代码更新UI组件。通过执行TaskScheduler的静态方法FormCurrentSynchronizeContext来获得同步上下文任务调度器的引用。
internal sealed class MyForm : Form{private readonly TaskScheduler m_syncContextTaskScheduler;public MyForm(){// 获得一个同步上下文任务调度器的引用m_syncContextTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();Text = "Synchronization Context Task Scheduler Demo";Visible = true; Width = 600; Height = 100;}private CancellationTokenSource m_cts;protected override void OnMouseClick(MouseEventArgs e){if (m_cts != null){ // An operation is in flight, cancel itm_cts.Cancel(); 712 PART V Threadingm_cts = null;}else{ // 操作正则进行,取消它Text = "Operation running";m_cts = new CancellationTokenSource();// 默认任务调度器调度的Task,在线程池执行Task<Int32> t = Task.Run(() => Sum(m_cts.Token, 20000), m_cts.Token);// 下面的任务使用同步上下文任务调度器,在GUI线程上执行t.ContinueWith(task => Text = "Result: " + task.Result,CancellationToken.None, TaskContinuationOptions.OnlyOnRanToCompletion,m_syncContextTaskScheduler);t.ContinueWith(task => Text = "Operation canceled",CancellationToken.None, TaskContinuationOptions.OnlyOnCanceled,m_syncContextTaskScheduler);t.ContinueWith(task => Text = "Operation faulted",CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted,m_syncContextTaskScheduler);}base.OnMouseClick(e);}}
微软在Parallel Extensions Extras包中提供了大量和任务相关的示例代码,比如:

标签:
原文地址:http://www.cnblogs.com/qianzi067/p/5819799.html