标题: C# - 简单介绍TaskScheduler
Title: C# - A Brief bump to the TaskScheduler
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.
-
///
-
/// This service is designed to return a TaskScheduler for application's main, UI thread.
-
/// This service MUST be instantiated on UI thread.
-
///
-
[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();
-
}
-
-
///
-
/// Gets the instance.
-
///
-
public static UITaskSchedulerService Instance
-
{
-
get
-
{
-
return InstanceField;
-
}
-
}
-
-
///
-
/// Get TaskScheduler to schedule Tasks on UI thread.
-
///
-
/// TaskScheduler to schedule Tasks on UI thread.
-
public TaskScheduler GetUITaskScheduler()
-
{
-
return TaskSchedulerUI;
-
}
-
-
///
-
/// Check whether current tread is UI tread
-
///
-
/// trueif current tread is UI tread.
-
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的 定义 ,它拿到的是当前thread的synchronization
context
Because
it internally use the TaskScheduler.FromCurrentSynchronizationContext. and
from the from MSDN, it retrieve the current
thread’s synchronization context.
-
Task.Factory
-
.StartNew(
-
() =>
-
_riskProvider.GetRiskPnL(),
-
CancellationToken.None,
-
TaskCreationOptions.None,
-
TaskScheduler.Default)
-
.ContinueWith(
-
(task) => ProcessResults(task.Result),
-
UITaskSchedulerService.Instance.GetUITaskScheduler()
-
)
-
//.ContinueWith(
-
// (task) => ProcessResults(task.Result),
-
// TaskScheduler.FromCurrentSynchronizationContext())
-
.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:
阅读(347) | 评论(0) | 转发(0) |