C#_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > C#

C#

 2014/6/3 13:12:07  简单介绍TaskScheduler  博客园  我要评论(0)
  • 摘要:taskScheduler根据定义ThetaskSchedulerbythedefinitionblurb.“Istheclasswheretheusagecontextiswithinthetasklibraries.“它的作用像是WPF/Winform时代的SynchronizationContext.ItisliketheSynchronizationcontextinthecrossWPF/Winformsera.像SynchronizationContext
  • 标签:C#

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" /> 收藏代码
  1. /// <summary>  
  2. /// This service is designed to return a TaskScheduler for application's main, UI thread.  
  3. /// This service MUST be instantiated on UI thread.  
  4. /// </summary>  
  5. [DebuggerNonUserCode]  
  6. public class UITaskSchedulerService : IUITaskSchedulerService  
  7. {  
  8.     private static readonly UITaskSchedulerService InstanceField = new UITaskSchedulerService();  
  9.     private static readonly TaskScheduler TaskSchedulerUI;  
  10.     private static readonly Thread GuiThread;  
  11.   
  12.     static UITaskSchedulerService()  
  13.     {  
  14.         GuiThread = Thread.CurrentThread;  
  15.         TaskSchedulerUI = TaskScheduler.FromCurrentSynchronizationContext();  
  16.     }  
  17.   
  18.     /// <summary>  
  19.     /// Gets the instance.  
  20.     /// </summary>  
  21.     public static UITaskSchedulerService Instance  
  22.     {  
  23.         get  
  24.         {  
  25.             return InstanceField;  
  26.         }  
  27.     }  
  28.   
  29.     /// <summary>  
  30.     /// Get TaskScheduler to schedule Tasks on UI thread.  
  31.     /// </summary>  
  32.     /// <returns>TaskScheduler to schedule Tasks on UI thread.</returns>  
  33.     public TaskScheduler GetUITaskScheduler()  
  34.     {  
  35.         return TaskSchedulerUI;  
  36.     }  
  37.   
  38.     /// <summary>  
  39.     /// Check whether current tread is UI tread  
  40.     /// </summary>  
  41.     /// <returns><c>true</c>if current tread is UI tread.</returns>  
  42.     public bool IsOnUIThread()  
  43.     {  
  44.         return GuiThread == Thread.CurrentThread;  
  45.     }  
  46. }  

 

该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" /> 收藏代码
  1. Task.Factory  
  2.                 .StartNew(  
  3.                     () =>  
  4.                     _riskProvider.GetRiskPnL(),  
  5.                     CancellationToken.None,  
  6.                     TaskCreationOptions.None,  
  7.                     TaskScheduler.Default)  
  8.                   .ContinueWith(  
  9.                     (task) => ProcessResults(task.Result),  
  10.                     UITaskSchedulerService.Instance.GetUITaskScheduler()  
  11.                     )  
  12.                 //.ContinueWith(  
  13.                 // (task) => ProcessResults(task.Result),  
  14.                 // TaskScheduler.FromCurrentSynchronizationContext())  
  15.                 .LogTaskExceptionIfAny(Log)  
  16.                 .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

发表评论
用户名: 匿名