{"id":772,"date":"2023-03-07T08:03:52","date_gmt":"2023-03-07T01:03:52","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=772"},"modified":"2023-03-20T13:55:47","modified_gmt":"2023-03-20T06:55:47","slug":"csharp-threadpool","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-concurrency\/csharp-threadpool\/","title":{"rendered":"C# Threadpool"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn how to use the C# <code>Threadpool<\/code> class to manage threads more efficiently.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to the C# Threadpool<\/h2>\n\n\n\n<p>In the previous tutorial, you learned how to <a href=\"https:\/\/csharptutorial.net\/csharp-concurrency\/csharp-thread\/\">develop multithreaded applications<\/a> by manually creating threads using the <code><a href=\"https:\/\/csharptutorial.net\/csharp-concurrency\/csharp-thread\/\">Thread<\/a><\/code> class.<\/p>\n\n\n\n<p>Typically, the number of threads that the application need is unknown beforehand. Also, the optimal number of threads that an application should have depends on some external factors including:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The number of CPU cores.<\/li>\n\n\n\n<li>The type of tasks that need to be executed.<\/li>\n\n\n\n<li>System performance.<\/li>\n<\/ul>\n\n\n\n<p>If you don&#8217;t consider these factors carefully, you may overload the system.<\/p>\n\n\n\n<p>A solution to this problem is to use a thread pool.<\/p>\n\n\n\n<p>By definition, a thread pool is managed pool of threads that can be used to execute tasks concurrently. The threads managed by the thread pool are often called worker threads. The worker threads are optimized for short-running tasks. Also, the worker threads are <a href=\"https:\/\/csharptutorial.net\/csharp-concurrency\/csharp-background-thread\/\">background threads<\/a>.<\/p>\n\n\n\n<p>The thread pool works as follows:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>First, a thread pool spawns a number of threads upfront. <\/li>\n\n\n\n<li>Second, when you submit a task to a thread pool, the thread pool adds the task to a queue and assigns a thread from a pool to execute the task.<\/li>\n\n\n\n<li>Third, once the thread completes the task, the thread pool returns the thread to the pool, ready for executing the next task.<\/li>\n<\/ul>\n\n\n\n<p>By doing this, the thread pool can reuse threads and avoid the overhead of creating and destroying threads for each task, which is very expensive in terms of time and resources.<\/p>\n\n\n\n<p>The following picture illustrates how the thread pool works:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/csharptutorial.net\/wp-content\/uploads\/2023\/03\/C-threadpool.svg\" alt=\"\" class=\"wp-image-779\"\/><\/figure>\n\n\n\n<p>To create a thread pool, you use the <code><code>ThreadPool<\/code><\/code> class. The <code><code>ThreadPool<\/code><\/code> class provides you with the <code>QueueUserWorkItem<\/code> for submitting tasks to the thread pool. <\/p>\n\n\n\n<p>The <code>QueueUserWorkItem<\/code> method queues a method for execution. In other words, the method executes when a thread in the thread pool is ready for execution.<\/p>\n\n\n\n<p>The <code>QueueUserWorkItem<\/code> method accepts an instance of the <code>WaitCallback<\/code> delegate with the following signature.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">delegate<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">WaitCallback<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">object<\/span>? state<\/span>)<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In the <code>WaitCallback<\/code> delegate, the <code>state<\/code> argument is an object that contains information used by the callback.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C# Threadpool example<\/h2>\n\n\n\n<p>The following example demonstrates how to use the <code>ThreadPool<\/code> class to create a thread pool:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">using<\/span> <span class=\"hljs-keyword\">static<\/span> System.Console;\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">CheckHttpStatus<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> url<\/span>)<\/span>\n{\n    HttpClient client = <span class=\"hljs-keyword\">new<\/span>();\n    <span class=\"hljs-keyword\">var<\/span> response = client.GetAsync(url).Result;\n    WriteLine(<span class=\"hljs-string\">$\"The HTTP status code of <span class=\"hljs-subst\">{url}<\/span> is <span class=\"hljs-subst\">{response.StatusCode}<\/span>\"<\/span>);\n\n}\n\nList&lt;<span class=\"hljs-keyword\">string<\/span>&gt; urls = <span class=\"hljs-keyword\">new<\/span>(){\n    <span class=\"hljs-string\">\"https:\/\/www.google.com\/\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/www.duckduckgo.com\/\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/www.yahoo.com\/\"<\/span>,\n};\n\n<span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> url <span class=\"hljs-keyword\">in<\/span> urls)\n{\n    ThreadPool.QueueUserWorkItem((state) =&gt; CheckHttpStatus(url));\n}\n\n\n<span class=\"hljs-comment\">\/\/ wait for all thread to complete<\/span>\n<span class=\"hljs-comment\">\/\/ and press a key<\/span>\nConsole.Read();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define a static method <code>CheckHttpStatus<\/code> to check the HTTP status code of an URL:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">CheckHttpStatus<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span> url<\/span>)<\/span>\n{\n    HttpClient client = <span class=\"hljs-keyword\">new<\/span>();\n    <span class=\"hljs-keyword\">var<\/span> response = client.GetAsync(url).Result;\n    WriteLine(<span class=\"hljs-string\">$\"The HTTP status code of <span class=\"hljs-subst\">{url}<\/span> is <span class=\"hljs-subst\">{response.StatusCode}<\/span>\"<\/span>);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, create a list of <code>URLs<\/code> to check:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">List&lt;<span class=\"hljs-keyword\">string<\/span>&gt; urls = <span class=\"hljs-keyword\">new<\/span>(){\n    <span class=\"hljs-string\">\"https:\/\/www.google.com\/\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/www.duckduckgo.com\/\"<\/span>,\n    <span class=\"hljs-string\">\"https:\/\/www.yahoo.com\/\"<\/span>,\n};<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Third, check the HTTP status code of each URL of the list by passing a lambda expression to the <code>QueueUserWorkItem()<\/code> method of the <code>ThreadPool<\/code> method:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">foreach<\/span> (<span class=\"hljs-keyword\">var<\/span> url <span class=\"hljs-keyword\">in<\/span> urls)\n{\n    ThreadPool.QueueUserWorkItem((state) =&gt; CheckHttpStatus(url));\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Finally, add the <code><code>Console.Read<\/code>()<\/code> that blocks the main thread to wait for all threads in the thread pool to be completed.<\/p>\n\n\n\n<p>It&#8217;s important to note that you can wait for all the tasks to be completed but we&#8217;ll cover it in the subsequent tutorial.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use a thread pool to improve the application&#8217;s performance by making efficient use of available resources and reducing the overhead of creating and destroying threads.<\/li>\n\n\n\n<li>Use the <code>ThreadPool<\/code> class to create a thread pool.<\/li>\n\n\n\n<li>Use the <code>QueueUserWorkItem<\/code> method of the <code>ThreadPool<\/code> class to submit tasks to the thread pool.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"772\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-concurrency\/csharp-threadpool\/\"\n\t\t\t\tdata-post-title=\"C# Threadpool\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"772\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-concurrency\/csharp-threadpool\/\"\n\t\t\t\tdata-post-title=\"C# Threadpool\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn about how to use the C# Threadpool class to manage threads more efficiently.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":760,"menu_order":2,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-772","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/772","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=772"}],"version-history":[{"count":5,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/772\/revisions"}],"predecessor-version":[{"id":1132,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/772\/revisions\/1132"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/760"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=772"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}