{"id":17795,"date":"2024-03-15T15:43:21","date_gmt":"2024-03-15T15:43:21","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/"},"modified":"2024-03-21T11:45:47","modified_gmt":"2024-03-21T11:45:47","slug":"how-to-implement-a-taskscheduler-in-c","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/","title":{"rendered":"How to implement a TaskScheduler in C#?"},"content":{"rendered":"<p>In C#, the TaskScheduler class from System.Threading.Tasks can be used to implement a task scheduler. Below is an example code that demonstrates how to create and schedule tasks.<\/p>\n<p>Firstly, we need to create a custom task scheduler class that inherits from TaskScheduler. In this class, we need to override the QueueTask method to add tasks to the task queue, and override the TryExecuteTaskInline method to execute tasks.<\/p>\n<pre class=\"post-pre\"><code><span class=\"hljs-keyword\">using<\/span> System;\r\n<span class=\"hljs-keyword\">using<\/span> System.Collections.Concurrent;\r\n<span class=\"hljs-keyword\">using<\/span> System.Collections.Generic;\r\n<span class=\"hljs-keyword\">using<\/span> System.Threading;\r\n<span class=\"hljs-keyword\">using<\/span> System.Threading.Tasks;\r\n\r\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CustomTaskScheduler<\/span> : <span class=\"hljs-title\">TaskScheduler<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">private<\/span> BlockingCollection&lt;Task&gt; taskQueue = <span class=\"hljs-keyword\">new<\/span> BlockingCollection&lt;Task&gt;();\r\n    <span class=\"hljs-keyword\">private<\/span> Thread schedulerThread;\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">CustomTaskScheduler<\/span>()<\/span>\r\n    {\r\n        schedulerThread = <span class=\"hljs-keyword\">new<\/span> Thread(RunScheduler);\r\n        schedulerThread.Start();\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected<\/span> <span class=\"hljs-keyword\">override<\/span> IEnumerable&lt;Task&gt; <span class=\"hljs-title\">GetScheduledTasks<\/span>()<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">return<\/span> taskQueue.ToArray();\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">QueueTask<\/span>(<span class=\"hljs-params\">Task task<\/span>)<\/span>\r\n    {\r\n        taskQueue.Add(task);\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">protected<\/span> <span class=\"hljs-keyword\">override<\/span> <span class=\"hljs-built_in\">bool<\/span> <span class=\"hljs-title\">TryExecuteTaskInline<\/span>(<span class=\"hljs-params\">Task task, <span class=\"hljs-built_in\">bool<\/span> taskWasPreviouslyQueued<\/span>)<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">if<\/span> (Thread.CurrentThread == schedulerThread)\r\n        {\r\n            <span class=\"hljs-keyword\">return<\/span> TryExecuteTask(task);\r\n        }\r\n        <span class=\"hljs-keyword\">else<\/span>\r\n        {\r\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-literal\">false<\/span>;\r\n        }\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">RunScheduler<\/span>()<\/span>\r\n    {\r\n        <span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> task <span class=\"hljs-keyword\">in<\/span> taskQueue.GetConsumingEnumerable())\r\n        {\r\n            TryExecuteTask(task);\r\n        }\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>Next, we can use a custom task scheduler to create and schedule tasks. In the following example, we create 10 tasks and submit them to the custom task scheduler using the Task.Factory.StartNew method.<\/p>\n<pre class=\"post-pre\"><code><span class=\"hljs-keyword\">using<\/span> System;\r\n<span class=\"hljs-keyword\">using<\/span> System.Threading.Tasks;\r\n\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\r\n{\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>()<\/span>\r\n    {\r\n        CustomTaskScheduler scheduler = <span class=\"hljs-keyword\">new<\/span> CustomTaskScheduler();\r\n\r\n        <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-built_in\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">10<\/span>; i++)\r\n        {\r\n            <span class=\"hljs-built_in\">int<\/span> taskNumber = i + <span class=\"hljs-number\">1<\/span>;\r\n            Task.Factory.StartNew(() =&gt; DoWork(taskNumber), CancellationToken.None, TaskCreationOptions.None, scheduler);\r\n        }\r\n\r\n        Console.ReadKey();\r\n    }\r\n\r\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">DoWork<\/span>(<span class=\"hljs-params\"><span class=\"hljs-built_in\">int<\/span> taskNumber<\/span>)<\/span>\r\n    {\r\n        Console.WriteLine(<span class=\"hljs-string\">\"Task {0} is executing on thread {1}\"<\/span>, taskNumber, Thread.CurrentThread.ManagedThreadId);\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>In the above code, we created 10 tasks and submitted them to a custom task scheduler using the Task.Factory.StartNew method. Each task will print out its task number and thread number.<\/p>\n<p>Please note that the task scheduler schedules tasks in order, so tasks may be executed on different threads, but their order is guaranteed.<\/p>\n<p>I hope this helps you!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In C#, the TaskScheduler class from System.Threading.Tasks can be used to implement a task scheduler. Below is an example code that demonstrates how to create and schedule tasks. Firstly, we need to create a custom task scheduler class that inherits from TaskScheduler. In this class, we need to override the QueueTask method to add tasks [&hellip;]<\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-17795","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to implement a TaskScheduler in C#? - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to implement a TaskScheduler in C#?\" \/>\n<meta property=\"og:description\" content=\"In C#, the TaskScheduler class from System.Threading.Tasks can be used to implement a task scheduler. Below is an example code that demonstrates how to create and schedule tasks. Firstly, we need to create a custom task scheduler class that inherits from TaskScheduler. In this class, we need to override the QueueTask method to add tasks [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\" \/>\n<meta property=\"article:published_time\" content=\"2024-03-15T15:43:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-21T11:45:47+00:00\" \/>\n<meta name=\"author\" content=\"Isabella Edwards\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:site\" content=\"@SiliCloudGlobal\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Isabella Edwards\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/\"},\"author\":{\"name\":\"Isabella Edwards\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/5579144e23c225c8188167f3e3f888dd\"},\"headline\":\"How to implement a TaskScheduler in C#?\",\"datePublished\":\"2024-03-15T15:43:21+00:00\",\"dateModified\":\"2024-03-21T11:45:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/\"},\"wordCount\":170,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/\",\"name\":\"How to implement a TaskScheduler in C#? - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2024-03-15T15:43:21+00:00\",\"dateModified\":\"2024-03-21T11:45:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to implement a TaskScheduler in C#?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"name\":\"Silicon Cloud Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\",\"name\":\"Silicon Cloud Blog\",\"url\":\"https:\/\/www.silicloud.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"contentUrl\":\"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png\",\"width\":1024,\"height\":1024,\"caption\":\"Silicon Cloud Blog\"},\"image\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/SiliCloudGlobal\/\",\"https:\/\/twitter.com\/SiliCloudGlobal\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/5579144e23c225c8188167f3e3f888dd\",\"name\":\"Isabella Edwards\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d4d4dec47f553ac7961d9fa4cc9bdcdcf5b7ce5106594330b6d25c5694fdbaec?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d4d4dec47f553ac7961d9fa4cc9bdcdcf5b7ce5106594330b6d25c5694fdbaec?s=96&d=mm&r=g\",\"caption\":\"Isabella Edwards\"},\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/isabellaedwards\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to implement a TaskScheduler in C#? - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/","og_locale":"en_US","og_type":"article","og_title":"How to implement a TaskScheduler in C#?","og_description":"In C#, the TaskScheduler class from System.Threading.Tasks can be used to implement a task scheduler. Below is an example code that demonstrates how to create and schedule tasks. Firstly, we need to create a custom task scheduler class that inherits from TaskScheduler. In this class, we need to override the QueueTask method to add tasks [&hellip;]","og_url":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2024-03-15T15:43:21+00:00","article_modified_time":"2024-03-21T11:45:47+00:00","author":"Isabella Edwards","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Isabella Edwards","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/"},"author":{"name":"Isabella Edwards","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/5579144e23c225c8188167f3e3f888dd"},"headline":"How to implement a TaskScheduler in C#?","datePublished":"2024-03-15T15:43:21+00:00","dateModified":"2024-03-21T11:45:47+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/"},"wordCount":170,"commentCount":0,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/","url":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/","name":"How to implement a TaskScheduler in C#? - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2024-03-15T15:43:21+00:00","dateModified":"2024-03-21T11:45:47+00:00","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/how-to-implement-a-taskscheduler-in-c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to implement a TaskScheduler in C#?"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/blog\/#website","url":"https:\/\/www.silicloud.com\/blog\/","name":"Silicon Cloud Blog","description":"","publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.silicloud.com\/blog\/#organization","name":"Silicon Cloud Blog","url":"https:\/\/www.silicloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","contentUrl":"https:\/\/www.silicloud.com\/blog\/wp-content\/uploads\/2023\/11\/EN-SILICON-Full.png","width":1024,"height":1024,"caption":"Silicon Cloud Blog"},"image":{"@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/SiliCloudGlobal\/","https:\/\/twitter.com\/SiliCloudGlobal"]},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/5579144e23c225c8188167f3e3f888dd","name":"Isabella Edwards","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d4d4dec47f553ac7961d9fa4cc9bdcdcf5b7ce5106594330b6d25c5694fdbaec?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d4d4dec47f553ac7961d9fa4cc9bdcdcf5b7ce5106594330b6d25c5694fdbaec?s=96&d=mm&r=g","caption":"Isabella Edwards"},"url":"https:\/\/www.silicloud.com\/blog\/author\/isabellaedwards\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/17795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=17795"}],"version-history":[{"count":1,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/17795\/revisions"}],"predecessor-version":[{"id":51431,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/17795\/revisions\/51431"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=17795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=17795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=17795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}