task Scheduler根据定义
The task Scheduler by the definition blurb.
“Is the class where the usage context is within the task libraries. “
它的作用像是WPF/Winform时代的SynchronizationContext.
It is like the Synchronization context in the cross WPF/Win forms era.
像SynchronizationContext.一样,TaskScheduler也有可能依赖特定的UI SynchronizationContext.
As with the Synchronization context, we may have requirement for like the UI context synchronization.
代码如下:
Give the code as below.
C#代码
javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash"> thread.%0A%20%20%20%20%2F%2F%2F%20This%20service%20MUST%20be%20instantiated%20on%20UI%20thread.%0A%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%5BDebuggerNonUserCode%5D%0A%20%20%20%20public%20class%20UITaskSchedulerService %20%3A%20IUITaskSchedulerService%0A%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20private%20static%20readonly%20UITaskSchedulerService%20InstanceField%20%3D%20new%20UITaskSchedulerService()%3B%0A%20%20%20%20%20%20%20%20private%20static%20readonly%20TaskScheduler%20TaskSchedulerUI%3B%0A%20%20%20%20%20%20%20%20private%20static%20readonly%20Thread%20GuiThread%3B%0A%20%0A%20%20%20%20%20%20%20%20static%20UITaskSchedulerService()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20GuiThread%20%3D%20Thread.CurrentThread%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20TaskSchedulerUI%20%3D%20TaskScheduler.FromCurrentSynchronizationContext()%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Csummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20Gets%20the%20instance .%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%20%20%20%20public%20static%20UITaskSchedulerService%20Instance%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20get%0A%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20InstanceField%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Csummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20Get%20TaskScheduler%20to%20schedule%20Tasks%20on%20UI%20thread.%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Creturns%3ETaskScheduler%20to%20schedule%20Tasks%20on%20UI%20thread.%3C%2Freturns%3E%0A%20%20%20%20%20%20%20%20public%20TaskScheduler%20GetUITaskScheduler()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20TaskSchedulerUI%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Csummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20Check%20whether%20current%20tread%20is%20UI%20tread%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3C%2Fsummary%3E%0A%20%20%20%20%20%20%20%20%2F%2F%2F%20%3Creturns%3E%3Cc%3Etrue%3C%2Fc%3Eif%20current%20tread%20is%20UI%20tread.%3C%2Freturns%3E%0A%20%20%20%20%20%20%20%20public%20bool%20IsOnUIThread()%0A%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20GuiThread%20%3D%3D%20Thread.CurrentThread%3B%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D" /> ways" />
[DebuggerNonUserCode]
public class UITaskSchedulerService : IUITaskSchedulerService
{
private static readonly UITaskSchedulerService InstanceField = new UITaskSchedulerService();
private static readonly TaskScheduler TaskSchedulerUI;
private static readonly Thread GuiThread;
static UITaskSchedulerService()
{
GuiThread = Thread.CurrentThread;
TaskSchedulerUI = TaskScheduler.FromCurrentSynchronizationContext();
}
public static UITaskSchedulerService Instance
{
get
{
return InstanceField;
}
}
public TaskScheduler GetUITaskScheduler()
{
return TaskSchedulerUI;
}
public bool IsOnUIThread()
{
return GuiThread == Thread.CurrentThread;
}
}
该class的要求是必须在UI thread初始化。
The requirement for the UITaskShcedulerService is that you should construct the singleton instance to start from a UI threads.
因为他内部使用的是TaskScheduler.FromCurrentSynchronizationContext,根据MSDN 的TaskScheduler Class 定义 ,它拿到的是当前thread的synchronization context
Because it internally use the TaskScheduler.FromCurrentSynchronizationContext. and from the TaskScheduler Class from MSDN, it retrieve the current thread’s synchronization context.
C#代码
Default)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.ContinueWith(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(task)%20%3D%3E%20ProcessResults(task.Result)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20UITaskSchedulerService.Instance.GetUITaskScheduler()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F.ContinueWith(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20(task)%20%3D%3E%20ProcessResults(task.Result)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%2F%2F%20TaskScheduler.FromCurrentSynchronizationContext())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.LogTaskExceptionIfAny(Log)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.ContinueWith(x%20%3D%3E%20DataUpdater())%3B" />
Task.Factory
.StartNew(
() =>
_riskProvider.GetRiskPnL(),
CancellationToken.None,
TaskCreationOptions.None,
TaskScheduler.Default)
.ContinueWith(
(task) => ProcessResults(task.Result),
UITaskSchedulerService.Instance.GetUITaskScheduler()
)
.LogTaskExceptionIfAny(Log)
.ContinueWith(x => DataUpdater());
处理结果需要dispatch到UI thread上,这样才能正确的显示。
We need to dispatch the process result back to the UI thread so that display can be properly handled.
References:
TaskScheduler Class