`

C# - 简单介绍TaskScheduler

阅读更多

标题: 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.

    /// <summary>
    /// This service is designed to return a TaskScheduler for application's main, UI thread.
    /// This service MUST be instantiated on UI thread.
    /// </summary>
    [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();
        }
 
        /// <summary>
        /// Gets the instance.
        /// </summary>
        public static UITaskSchedulerService Instance
        {
            get
            {
                return InstanceField;
            }
        }
 
        /// <summary>
        /// Get TaskScheduler to schedule Tasks on UI thread.
        /// </summary>
        /// <returns>TaskScheduler to schedule Tasks on UI thread.</returns>
        public TaskScheduler GetUITaskScheduler()
        {
            return TaskSchedulerUI;
        }
 
        /// <summary>
        /// Check whether current tread is UI tread
        /// </summary>
        /// <returns><c>true</c>if current tread is UI tread.</returns>
        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,根据MSDNTaskScheduler Class 定义 ,它拿到的是当前threadsynchronization context

 

Because it  internally use the TaskScheduler.FromCurrentSynchronizationContext. and from the TaskScheduler Class 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());

 处理结果需要dispatchUI thread上,这样才能正确的显示。

 

We need to dispatch the process result back to the UI thread so that display can be properly handled.


References:

TaskScheduler Class

分享到:
评论

相关推荐

    dotnet-SharpTask是一个简单的代码集可与TaskScheduler服务api交互并与CobaltStrike兼容

    《深入理解dotnet-SharpTask:与TaskScheduler服务API交互及CobaltStrike兼容性》 在.NET开发领域,有时我们需要对系统任务进行自动化管理,例如定时执行某些操作或者与安全工具集成。dotnet-SharpTask就是这样一个...

    C#实验--- A.3 矩阵并行计算练习

    可以使用TaskScheduler和ParallelOptions类来定制并行策略,如限制最大并行度,或者指定特定的线程池。 在实际编程中,我们还需要考虑错误处理和性能监控,确保程序的稳定性和效率。Visual Studio的性能分析工具...

    C#向系統添加任務計劃

    在本例中,`TaskScheduler.dll`可能是一个封装了与任务计划程序交互功能的自定义库。 要添加任务计划,我们首先需要导入相关的命名空间,如`System.Threading.Tasks`和`Microsoft.Win32.TaskScheduler`。`Microsoft...

    WindowsCronJobs:一个简单的 c#.Net 应用程序,它将请求一个网页 1 次或多次间隔。 旨在用作 Windows 平台上的 Cron Job 替代品。 只需设置 Task Scheduler 以使用一些参数调用它,就完成了

    这只存在是因为 Windows TaskScheduler 不支持 URL。 用法 您通常会有一个不同的 url,例如或类似的东西,但在这些示例中我们只是使用 bing.com。 请求 bing.com 一次,然后退出。 WindowsCronJobs ...

    C# 动态设置程序是否开机运行

    以下将详细介绍如何使用C#来实现这一功能。 首先,我们需要了解Windows注册表中的`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run`键。这个键存储了当用户登录时应启动的程序信息。我们可以通过...

    c#在odb.net下实现数据库从mysql->oracle迁移

    “可以定时转移”意味着程序还具备计划任务的能力,可能是通过Windows Task Scheduler或者内置的定时器组件来定期执行迁移。这需要编写代码来管理任务调度和执行。 “但需要对开发环境进行简单配置(odbc)”提示...

    c#指定时间运行程序

    C#中可以通过`Microsoft.Win32.TaskScheduler`库来操作计划任务。首先,你需要安装NuGet包`TaskScheduler`,然后可以创建、读取、修改或删除计划任务。这是一个创建任务的示例: ```csharp using Microsoft.Win32....

    c# 实现任务计划 类似windows的任务计划

    此外,如果希望实现的功能更加接近Windows任务计划器,可以考虑使用Microsoft.Win32.TaskScheduler库。这是一个开源库,提供了与Windows任务计划器进行交互的能力,可以创建、修改、删除和查询任务。使用这个库,你...

    C# 并行编程代码示例 - 命令式任务并行

    CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); task.Wait(); ``` 三、并行循环:`Parallel.ForEach`和`Parallel.For` 1. `Parallel.ForEach`用于遍历集合中的每个元素,同时支持...

    C#仿照系统调度计划任务

    此外,如果你的系统需要在Windows环境下运行,还可以利用Windows的计划任务服务(Task Scheduler),通过创建和管理Task Scheduler任务来实现更高级的功能。C#中的`System.Management.Automation`命名空间提供了与...

    C# 解决Win7服务与桌面交互应用(服务启动后台应用程序)

    3. **使用Task Scheduler**:服务可以安排一个任务,由Task Scheduler在用户登录后执行。这允许用户界面应用在适当的时间被正确地启动。 4. **利用PowerShell或Cmd执行命令**:服务可以调用PowerShell或Cmd命令行,...

    双色球历史数据和简单的统计源码(c#)

    C#有System.Threading.Timer类可以创建定时器,或者使用Windows服务配合Task Scheduler定期执行任务。定时器触发时,会自动执行数据抓取和更新数据库的逻辑。 此外,源码中可能还包含了数据可视化部分,用以展示...

    C#并行编程高级教程(中文版)

    合理利用任务调度器(TaskScheduler),可以更精细地控制任务的执行策略。 ### 四、常见问题与解决策略 #### 4.1 性能调优 并行编程并不总是意味着性能提升,不当的并行化可能导致性能下降。开发者需要通过性能...

    C#开机自动运行程序

    C#中可以使用`TaskScheduler`命名空间来操作任务计划。 下面是一个简单的C#示例,用于将程序添加到启动文件夹: ```csharp using System; using System.IO; class Program { static void Main() { string ...

    C#功能实现的源代码

    通过学习和理解这些源代码,开发者不仅可以掌握系统控制的实现方式,还可以进一步探索C#与操作系统交互的其他方法,如使用P/Invoke调用Windows API,或者利用.NET Framework的其他功能,比如Task Scheduler(任务...

    C# Winform 自动运行 不用输入密码登录进入桌面可以运行的程序

    此外,另一种方法是使用计划任务,通过`Task Scheduler` API来创建一个计划任务,使其在用户登录时启动你的程序。这种方法相对简单,但不适用于无密码登录的场景。 综上所述,实现"C# Winform 自动运行 无需登录...

    C# 三种简单异步通信方法

    在C#编程中,异步通信是提升应用性能和用户体验的关键技术。本文将详细解析三种简单易用的异步通信方法...同时,结合`TaskScheduler`和`Control.Invoke`等工具,可以更好地管理和控制异步任务,实现更复杂的应用场景。

    C#在开机时自动启动程序

    using Microsoft.Win32.TaskScheduler; public static void CreateScheduledTask(string programPath) { using (TaskService taskService = new TaskService()) { TaskDefinition taskDefinition = taskService....

    C# Winform线程创建子窗体

    }, TaskScheduler.FromCurrentSynchronizationContext()); ``` `Task.Delay`会等待指定的时间,然后在相同的UI同步上下文中继续执行,这样可以确保安全地更新UI。 在实际项目中,可能还需要考虑线程间通信、线程...

    如何使用主线程异常捕获错误例子C#.net源代码编写

    对于控制台应用程序,由于没有用户界面,你可能需要直接在`Main`方法中捕获异常,或者使用`System.Threading.Tasks.TaskScheduler.UnobservedTaskException`事件来处理未观察到的任务异常。 总结起来,正确处理主线...

Global site tag (gtag.js) - Google Analytics