标题: 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,根据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.
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:
相关推荐
《深入理解dotnet-SharpTask:与TaskScheduler服务API交互及CobaltStrike兼容性》 在.NET开发领域,有时我们需要对系统任务进行自动化管理,例如定时执行某些操作或者与安全工具集成。dotnet-SharpTask就是这样一个...
可以使用TaskScheduler和ParallelOptions类来定制并行策略,如限制最大并行度,或者指定特定的线程池。 在实际编程中,我们还需要考虑错误处理和性能监控,确保程序的稳定性和效率。Visual Studio的性能分析工具...
在本例中,`TaskScheduler.dll`可能是一个封装了与任务计划程序交互功能的自定义库。 要添加任务计划,我们首先需要导入相关的命名空间,如`System.Threading.Tasks`和`Microsoft.Win32.TaskScheduler`。`Microsoft...
这只存在是因为 Windows TaskScheduler 不支持 URL。 用法 您通常会有一个不同的 url,例如或类似的东西,但在这些示例中我们只是使用 bing.com。 请求 bing.com 一次,然后退出。 WindowsCronJobs ...
以下将详细介绍如何使用C#来实现这一功能。 首先,我们需要了解Windows注册表中的`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run`键。这个键存储了当用户登录时应启动的程序信息。我们可以通过...
“可以定时转移”意味着程序还具备计划任务的能力,可能是通过Windows Task Scheduler或者内置的定时器组件来定期执行迁移。这需要编写代码来管理任务调度和执行。 “但需要对开发环境进行简单配置(odbc)”提示...
C#中可以通过`Microsoft.Win32.TaskScheduler`库来操作计划任务。首先,你需要安装NuGet包`TaskScheduler`,然后可以创建、读取、修改或删除计划任务。这是一个创建任务的示例: ```csharp using Microsoft.Win32....
此外,如果希望实现的功能更加接近Windows任务计划器,可以考虑使用Microsoft.Win32.TaskScheduler库。这是一个开源库,提供了与Windows任务计划器进行交互的能力,可以创建、修改、删除和查询任务。使用这个库,你...
CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Default); task.Wait(); ``` 三、并行循环:`Parallel.ForEach`和`Parallel.For` 1. `Parallel.ForEach`用于遍历集合中的每个元素,同时支持...
此外,如果你的系统需要在Windows环境下运行,还可以利用Windows的计划任务服务(Task Scheduler),通过创建和管理Task Scheduler任务来实现更高级的功能。C#中的`System.Management.Automation`命名空间提供了与...
3. **使用Task Scheduler**:服务可以安排一个任务,由Task Scheduler在用户登录后执行。这允许用户界面应用在适当的时间被正确地启动。 4. **利用PowerShell或Cmd执行命令**:服务可以调用PowerShell或Cmd命令行,...
C#有System.Threading.Timer类可以创建定时器,或者使用Windows服务配合Task Scheduler定期执行任务。定时器触发时,会自动执行数据抓取和更新数据库的逻辑。 此外,源码中可能还包含了数据可视化部分,用以展示...
合理利用任务调度器(TaskScheduler),可以更精细地控制任务的执行策略。 ### 四、常见问题与解决策略 #### 4.1 性能调优 并行编程并不总是意味着性能提升,不当的并行化可能导致性能下降。开发者需要通过性能...
C#中可以使用`TaskScheduler`命名空间来操作任务计划。 下面是一个简单的C#示例,用于将程序添加到启动文件夹: ```csharp using System; using System.IO; class Program { static void Main() { string ...
通过学习和理解这些源代码,开发者不仅可以掌握系统控制的实现方式,还可以进一步探索C#与操作系统交互的其他方法,如使用P/Invoke调用Windows API,或者利用.NET Framework的其他功能,比如Task Scheduler(任务...
此外,另一种方法是使用计划任务,通过`Task Scheduler` API来创建一个计划任务,使其在用户登录时启动你的程序。这种方法相对简单,但不适用于无密码登录的场景。 综上所述,实现"C# Winform 自动运行 无需登录...
在C#编程中,异步通信是提升应用性能和用户体验的关键技术。本文将详细解析三种简单易用的异步通信方法...同时,结合`TaskScheduler`和`Control.Invoke`等工具,可以更好地管理和控制异步任务,实现更复杂的应用场景。
using Microsoft.Win32.TaskScheduler; public static void CreateScheduledTask(string programPath) { using (TaskService taskService = new TaskService()) { TaskDefinition taskDefinition = taskService....
}, TaskScheduler.FromCurrentSynchronizationContext()); ``` `Task.Delay`会等待指定的时间,然后在相同的UI同步上下文中继续执行,这样可以确保安全地更新UI。 在实际项目中,可能还需要考虑线程间通信、线程...
对于控制台应用程序,由于没有用户界面,你可能需要直接在`Main`方法中捕获异常,或者使用`System.Threading.Tasks.TaskScheduler.UnobservedTaskException`事件来处理未观察到的任务异常。 总结起来,正确处理主线...