Task核心调度器[TaskScheduler]

一:TaskScheduler

问:TaskScheduler是做什么的?

答:我们发现任务执行要经过Scheduler。Task的核心就是这个Scheduler,因为他把要执行任务安排在线程或者线程池中。TaskScheduler由Thread和ThreadPool组成。

1573211558433

二:在.net FrameWork中有两种TaskScheduler

1.ThreadPoolTaskScheduler

也就是Task的默认是调用ThreadPool

1
2
3
4
5
6
7
8
9
10
11
12
13
protected internal override void QueueTask(Task task)
{
if ((task.Options & TaskCreationOptions.LongRunning) != TaskCreationOptions.None)
{
new Thread(ThreadPoolTaskScheduler.s_longRunningThreadWork)
{
IsBackground = true
}.Start(task);
return;
}
bool forceGlobal = (task.Options & TaskCreationOptions.PreferFairness) > TaskCreationOptions.None;
ThreadPool.UnsafeQueueCustomWorkItem(task, forceGlobal);
}

2.SynchronizationContextTaskScheduler

1.同步上下文

Task task = new Task(() =>
{
    try
    {
        label1.Text = "das";
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
});
task.Start(TaskScheduler.FromCurrentSynchronizationContext());

2.操作耗时线程

1
2
3
4
5
6
7
8
var task = Task.Factory.StartNew(() =>
{
Thread.Sleep(10000);
});
task.ContinueWith(t =>
{
label1.Text = "你好!";
}, TaskScheduler.FromCurrentSynchronizationContext());

ContinueWith等待执行完耗时线程,在同步上下文

三:如何自定义Scheduler?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class PerThreadTaskScheduler : TaskScheduler
{
/// <summary>
/// 给debug
/// </summary>
/// <returns></returns>
protected override IEnumerable<Task> GetScheduledTasks()
{
return Enumerable.Empty<Task>();
}
/// <summary>
/// 执行Task
/// </summary>
/// <param name="task"></param>
protected override void QueueTask(Task task)
{
var thread = new Thread(()=> {
TryExecuteTask(task);
});
thread.Start();
}
/// <summary>
/// 同步执行
/// </summary>
/// <param name="task"></param>
/// <param name="taskWasPreviouslyQueued"></param>
/// <returns></returns>
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
return true;
}
}