{"id":23946,"date":"2024-03-16T02:18:11","date_gmt":"2024-03-16T02:18:11","guid":{"rendered":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/"},"modified":"2024-03-22T02:30:04","modified_gmt":"2024-03-22T02:30:04","slug":"understanding-and-using-manualresetevent-in-c-learning","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/","title":{"rendered":"Understanding and using ManualResetEvent in C# learning"},"content":{"rendered":"<p>ManualResetEvent is a class used for thread synchronization, allowing one or more threads to wait until a certain event occurs. It has two states: triggered and untriggered. When the event is untriggered, all waiting threads will be blocked until the event is manually triggered. Once the event is triggered, the waiting threads will be awakened and continue execution.<\/p>\n<p>Here are the main methods and properties of ManualResetEvent:<\/p>\n<ol>\n<li>Set(): Set the event state to triggered and wake up all waiting threads.<\/li>\n<li>Reset(): Set the event status to untriggered.<\/li>\n<li>WaitOne() method: Waits for the event to be triggered. If the event has already been triggered, it returns immediately; otherwise, the thread will be blocked until the event is triggered.<\/li>\n<li>WaitOne(timeout): Wait for the event to be triggered. If the event has already been triggered, return immediately; otherwise, the thread will be blocked until the event is triggered or until the timeout expires.<\/li>\n<\/ol>\n<p>Here is an example of using ManualResetEvent:<\/p>\n<pre class=\"post-pre\"><code><span class=\"hljs-keyword\">using<\/span> System;\r\n<span class=\"hljs-keyword\">using<\/span> System.Threading;\r\n\r\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\r\n{\r\n    <span class=\"hljs-keyword\">static<\/span> ManualResetEvent manualResetEvent = <span class=\"hljs-keyword\">new<\/span> ManualResetEvent(<span class=\"hljs-literal\">false<\/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 class=\"hljs-params\"><span class=\"hljs-built_in\">string<\/span>[] args<\/span>)<\/span>\r\n    {\r\n        Thread thread1 = <span class=\"hljs-keyword\">new<\/span> Thread(Work);\r\n        Thread thread2 = <span class=\"hljs-keyword\">new<\/span> Thread(Work);\r\n\r\n        thread1.Start();\r\n        thread2.Start();\r\n\r\n        <span class=\"hljs-comment\">\/\/ \u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4<\/span>\r\n        Thread.Sleep(<span class=\"hljs-number\">2000<\/span>);\r\n\r\n        <span class=\"hljs-comment\">\/\/ \u89e6\u53d1\u4e8b\u4ef6\uff0c\u5524\u9192\u7b49\u5f85\u7684\u7ebf\u7a0b<\/span>\r\n        manualResetEvent.Set();\r\n\r\n        <span class=\"hljs-comment\">\/\/ \u7b49\u5f85\u7ebf\u7a0b\u6267\u884c\u5b8c\u6bd5<\/span>\r\n        thread1.Join();\r\n        thread2.Join();\r\n\r\n        Console.WriteLine(<span class=\"hljs-string\">\"All threads completed.\"<\/span>);\r\n        Console.ReadLine();\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\">Work<\/span>()<\/span>\r\n    {\r\n        Console.WriteLine(<span class=\"hljs-string\">\"Thread {0} waiting.\"<\/span>, Thread.CurrentThread.ManagedThreadId);\r\n\r\n        <span class=\"hljs-comment\">\/\/ \u7b49\u5f85\u4e8b\u4ef6\u7684\u89e6\u53d1<\/span>\r\n        manualResetEvent.WaitOne();\r\n\r\n        Console.WriteLine(<span class=\"hljs-string\">\"Thread {0} resumed.\"<\/span>, Thread.CurrentThread.ManagedThreadId);\r\n    }\r\n}\r\n<\/code><\/pre>\n<p>In the example above, we created two worker threads, thread1 and thread2, and had them wait for the manualResetEvent event to be triggered. In the main thread, after waiting for 2 seconds, we manually triggered the manualResetEvent event. This caused the two worker threads to wake up, continue executing, and ultimately output &#8220;All threads completed.&#8221;<\/p>\n<p>ManualResetEvent is very useful in multithreaded programming as it allows for synchronization and coordination between threads. It is important to note that once a ManualResetEvent is set, it will remain in the set state until we call the Reset() method to reset it to the unset state.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ManualResetEvent is a class used for thread synchronization, allowing one or more threads to wait until a certain event occurs. It has two states: triggered and untriggered. When the event is untriggered, all waiting threads will be blocked until the event is manually triggered. Once the event is triggered, the waiting threads will be awakened [&hellip;]<\/p>\n","protected":false},"author":10,"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-23946","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>Understanding and using ManualResetEvent in C# learning - 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\/understanding-and-using-manualresetevent-in-c-learning\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Understanding and using ManualResetEvent in C# learning\" \/>\n<meta property=\"og:description\" content=\"ManualResetEvent is a class used for thread synchronization, allowing one or more threads to wait until a certain event occurs. It has two states: triggered and untriggered. When the event is untriggered, all waiting threads will be blocked until the event is manually triggered. Once the event is triggered, the waiting threads will be awakened [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/\" \/>\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-16T02:18:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-03-22T02:30:04+00:00\" \/>\n<meta name=\"author\" content=\"Jackson Davis\" \/>\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=\"Jackson Davis\" \/>\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\/understanding-and-using-manualresetevent-in-c-learning\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/\"},\"author\":{\"name\":\"Jackson Davis\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/55a10b8b0457c35884c25677889ad350\"},\"headline\":\"Understanding and using ManualResetEvent in C# learning\",\"datePublished\":\"2024-03-16T02:18:11+00:00\",\"dateModified\":\"2024-03-22T02:30:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/\"},\"wordCount\":266,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/\",\"url\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/\",\"name\":\"Understanding and using ManualResetEvent in C# learning - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/#website\"},\"datePublished\":\"2024-03-16T02:18:11+00:00\",\"dateModified\":\"2024-03-22T02:30:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.silicloud.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Understanding and using ManualResetEvent in C# learning\"}]},{\"@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\/55a10b8b0457c35884c25677889ad350\",\"name\":\"Jackson Davis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g\",\"caption\":\"Jackson Davis\"},\"url\":\"https:\/\/www.silicloud.com\/blog\/author\/jacksondavis\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Understanding and using ManualResetEvent in C# learning - 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\/understanding-and-using-manualresetevent-in-c-learning\/","og_locale":"en_US","og_type":"article","og_title":"Understanding and using ManualResetEvent in C# learning","og_description":"ManualResetEvent is a class used for thread synchronization, allowing one or more threads to wait until a certain event occurs. It has two states: triggered and untriggered. When the event is untriggered, all waiting threads will be blocked until the event is manually triggered. Once the event is triggered, the waiting threads will be awakened [&hellip;]","og_url":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/","og_site_name":"Blog - Silicon Cloud","article_publisher":"https:\/\/www.facebook.com\/SiliCloudGlobal\/","article_published_time":"2024-03-16T02:18:11+00:00","article_modified_time":"2024-03-22T02:30:04+00:00","author":"Jackson Davis","twitter_card":"summary_large_image","twitter_creator":"@SiliCloudGlobal","twitter_site":"@SiliCloudGlobal","twitter_misc":{"Written by":"Jackson Davis","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/#article","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/"},"author":{"name":"Jackson Davis","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/55a10b8b0457c35884c25677889ad350"},"headline":"Understanding and using ManualResetEvent in C# learning","datePublished":"2024-03-16T02:18:11+00:00","dateModified":"2024-03-22T02:30:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/"},"wordCount":266,"commentCount":0,"publisher":{"@id":"https:\/\/www.silicloud.com\/blog\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/","url":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/","name":"Understanding and using ManualResetEvent in C# learning - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/blog\/#website"},"datePublished":"2024-03-16T02:18:11+00:00","dateModified":"2024-03-22T02:30:04+00:00","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/blog\/understanding-and-using-manualresetevent-in-c-learning\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.silicloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Understanding and using ManualResetEvent in C# learning"}]},{"@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\/55a10b8b0457c35884c25677889ad350","name":"Jackson Davis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.silicloud.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2fdb47d6df1226e92380d96973782572a97b0675d098bb914410dec348eb5d29?s=96&d=mm&r=g","caption":"Jackson Davis"},"url":"https:\/\/www.silicloud.com\/blog\/author\/jacksondavis\/"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/23946","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\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/comments?post=23946"}],"version-history":[{"count":1,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/23946\/revisions"}],"predecessor-version":[{"id":57953,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/posts\/23946\/revisions\/57953"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/media?parent=23946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/categories?post=23946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/blog\/wp-json\/wp\/v2\/tags?post=23946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}