{"id":803,"date":"2023-03-08T11:35:51","date_gmt":"2023-03-08T04:35:51","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=803"},"modified":"2023-03-20T14:11:53","modified_gmt":"2023-03-20T07:11:53","slug":"csharp-background-thread","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-concurrency\/csharp-background-thread\/","title":{"rendered":"C# Background Thread"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about the C# background threads and the difference between the background and foreground threads.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to C# background threads<\/h2>\n\n\n\n<p>.NET has two types of threads:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Foreground<\/li>\n\n\n\n<li>Background<\/li>\n<\/ul>\n\n\n\n<p>When a C# program runs, .NET creates a thread which is known as the <strong>main thread<\/strong>. <\/p>\n\n\n\n<p>A foreground thread is a kind of thread that executes with the same priority as the main thread. A foreground thread keeps the application running until it is completed or aborted. In other words, the application will not be terminated if there are foreground threads running.<\/p>\n\n\n\n<p>By default, the threads created using the <code>Thread<\/code> class are foreground threads. Also, the main thread is a foreground thread.<\/p>\n\n\n\n<p>The following example illustrates how a foreground thread works:<\/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\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">DoWork<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">5<\/span>; i++)\n    {\n        Thread.Sleep(<span class=\"hljs-number\">100<\/span>);\n        Console.WriteLine(<span class=\"hljs-string\">\"Foreground thread running...\"<\/span>);\n        \n    }\n}\n\n<span class=\"hljs-keyword\">var<\/span> t = <span class=\"hljs-keyword\">new<\/span> Thread(DoWork);\nt.Start();\n\n\n<span class=\"hljs-comment\">\/\/ Do some work in the main thread<\/span>\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">2<\/span>; i++)\n{\n    Thread.Sleep(<span class=\"hljs-number\">100<\/span>);\n    Console.WriteLine(<span class=\"hljs-string\">\"Main thread running...\"<\/span>);\n    \n}<\/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>Output:<\/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\">Main thread running...\nForeground thread running...\nMain thread running...\nForeground thread running...\nForeground thread running...\nForeground thread running...\nForeground thread running...<\/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 the <code>DoWork()<\/code> method that displays the same message fives time in every 100 ms:<\/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\">DoWork<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">5<\/span>; i++)\n    {\n        Console.WriteLine(<span class=\"hljs-string\">\"Foreground thread running...\"<\/span>);\n        Thread.Sleep(<span class=\"hljs-number\">100<\/span>);\n    }\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 new thread that executes the <code>DoWork()<\/code> method and start it:<\/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\"><span class=\"hljs-keyword\">var<\/span> t = <span class=\"hljs-keyword\">new<\/span> Thread(DoWork);\nt.Start();<\/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, display the same message twice in the main thread every 100 ms:<\/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-comment\">\/\/ Do some work in the main thread<\/span>\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">2<\/span>; i++)\n{\n    Console.WriteLine(<span class=\"hljs-string\">\"Main thread running...\"<\/span>);\n    Thread.Sleep(<span class=\"hljs-number\">100<\/span>);\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>The output shows that after the main thread ends, the foreground thread is still running. Therefore, you see five messages from the foreground thread.<\/p>\n\n\n\n<p>Unlike a foreground thread, a background thread is a kind of thread that runs in the background and does not keep the application running after the main thread ends.<\/p>\n\n\n\n<p>In other words, regardless of whether any background threads are running, the application will end if all foreground threads terminate.<\/p>\n\n\n\n<p>To change a thread from foreground to background, you use the <code>IsBackground<\/code> property of the Thread object. For example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" 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\">DoWork<\/span>(<span class=\"hljs-params\"><\/span>)<\/span>\n{\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">5<\/span>; i++)\n    {\n        Thread.Sleep(<span class=\"hljs-number\">100<\/span>);\n        Console.WriteLine(<span class=\"hljs-string\">\"Background thread running...\"<\/span>);\n        \n    }\n}\n\n<span class=\"hljs-keyword\">var<\/span> t = <span class=\"hljs-keyword\">new<\/span> Thread(DoWork);\nt.IsBackground = <span class=\"hljs-literal\">true<\/span>;\nt.Start();\n\n\n<span class=\"hljs-comment\">\/\/ Do some work in the main thread<\/span>\n<span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">2<\/span>; i++)\n{\n    Thread.Sleep(<span class=\"hljs-number\">100<\/span>);\n    Console.WriteLine(<span class=\"hljs-string\">\"Main thread running...\"<\/span>);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><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>Output:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">Main thread running...\nBackground thread running...\nMain thread running...<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><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 this example, we change the thread from the foreground to the background. When the main thread is terminated, the background thread is also ended. Therefore, you see only one message from the background thread.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C# background thread applications<\/h2>\n\n\n\n<p>Background threads have the following practical applications:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enhancing responsiveness of the application: Background threads can be used to do time-consuming operations like file I\/O, network operations, or database queries without obstructing the main UI thread.<\/li>\n\n\n\n<li>Parallel processing: The performance of the application can be greatly improved by using background threads to carry out parallel processing of huge datasets or complicated calculations.<\/li>\n\n\n\n<li>Background processing: Tasks that don&#8217;t need user input, including data synchronization, backup, or maintenance, can be carried out in the background using background threads.<\/li>\n\n\n\n<li>Multithreaded network applications: Background threads can be used in multithreaded network applications to handle multiple requests simultaneously.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A foreground thread keeps the application running until it is completed or aborted.<\/li>\n\n\n\n<li>A background thread is a kind of thread that doesn&#8217;t keep the application running after the main thread has terminated.<\/li>\n\n\n\n<li>Use the <code>IsBackground<\/code> property to change a thread from foreground to background.<\/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=\"803\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-concurrency\/csharp-background-thread\/\"\n\t\t\t\tdata-post-title=\"C# Background Thread\"\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=\"803\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-concurrency\/csharp-background-thread\/\"\n\t\t\t\tdata-post-title=\"C# Background Thread\"\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>Summary: in this tutorial, you&#8217;ll learn about the C# background threads and the difference between the background and foreground threads. Introduction to C# background threads .NET has two types of threads: When a C# program runs, .NET creates a thread which is known as the main thread. A foreground thread is a kind of thread [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":760,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-803","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/803","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=803"}],"version-history":[{"count":5,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/803\/revisions"}],"predecessor-version":[{"id":1138,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/803\/revisions\/1138"}],"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=803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}