{"id":3573,"date":"2022-02-08T12:20:40","date_gmt":"2022-02-08T11:20:40","guid":{"rendered":"http:\/\/www.capri-soft.de\/blog\/?p=3573"},"modified":"2022-02-08T14:49:38","modified_gmt":"2022-02-08T13:49:38","slug":"c-threads-was-bedeutet-signaled-beim-autoresetevent-konstruktor","status":"publish","type":"post","link":"https:\/\/www.capri-soft.de\/blog\/?p=3573","title":{"rendered":"C# Threads: Was bedeutet &#8222;signaled&#8220; beim AutoResetEvent-Konstruktor und im Kontext von AutoResetEvent?"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"problemfeld\">Problemfeld<\/h2>\n\n\n\n<p>AutoResetEvent bietet \u00fcber einen globalen oder \u00fcbergeordneten Kontext die M\u00f6glichkeit durch den Aufruf der WaitOne-Methode innerhalb des Thread-Codes, Threads zu blockieren bis ein Signal aus einem anderem Kontext gesendet wird. Der andere Kontext sollte dabei auch Zugriff auf das steuernde AutoResetEvent-Objekt haben. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"konstruktor-parameter\">Konstruktor-Parameter<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nAutoResetEvent event_1 = new AutoResetEvent(true);\nAutoResetEvent event_2 = new AutoResetEvent(false);\n<\/pre><\/div>\n\n\n<p>Ein Thread, welcher event_1.WaitOne() aufruft, <strong>blockiert nicht<\/strong> da <strong>signaled <\/strong>auf <strong>TRUE<\/strong> steht.<\/p>\n\n\n\n<p>Ein Thread, welcher event_2.WaitOne() aufruft, <strong>blockiert <\/strong>da <strong>signaled <\/strong>\u00fcber den Konstruktor mit  <strong>FALSE <\/strong>initialisiert wurde.<\/p>\n\n\n\n<p>Ruft ein Thread die Methode &#8222;WaitOne&#8220; auf, wird dieser allerdings nur blockiert, wenn AutoResetEvent mit false initialisiert wurde. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"event-auf-signaled-ohne-konstruktor-setzen\">Event auf &#8222;signaled&#8220; ohne Konstruktor setzen<\/h2>\n\n\n\n<p>Um die blockierten Threads nun aus einem anderen Kontext, welcher auch Zugriff auf das AutoResetEvent-Objekt haben muss,  zu steuern k\u00f6nnen die Methoden .Set() und .Reset() des AutoResetEvents aus dem steuerenden Kontext heraus genutzt werden:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n\/\/ Setzt den Status auf &quot;nicht signalisiert&quot; \/ &quot;non signaled&quot; \n\/\/ Threads blockieren nach Aufruf von AutoResetEvent.WaitOne()\nevent_1.Reset(); \n\n\/\/ Setzt den Status auf &quot;signalisiert&quot; \/ &quot;signaled&quot;\n\/\/ Threads blockieren NICHT nach Aufruf von AutoResetEvent.WaitOne()\nevent_2.Set(); \n<\/pre><\/div>\n\n\n<p>Nur einer, der wartenden Threads erh\u00e4lt ein Signal wenn Set() aufgerufen wird. Will man alle wartenden Threads befreien, muss man Set() mehrfach aufrufen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"unterschied-zu-manualresetevent\">Unterschied zu ManualResetEvent<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>ManualResetEvent signalisiert <strong>allen wartenden Threads<\/strong>, dass diese die WaitOne()-Methode passieren d\u00fcrfen.  Sie ist also wie eine T\u00fcr, die sich f\u00fcr alle \u00f6ffnet.  ManualResetEvent.Reset(); schlie\u00dft, die T\u00fcr, ManualResetEvent.Set(); \u00f6ffnet die T\u00fcr.<\/li><li>AutoResetEvent signaliert <strong>maximal einem wartendendem Thread<\/strong>, dass er nach Aufruf der AutoResetEvent.WaitOne()-Methode weitermachen darf. Um alle blockierten Threads zu befreien, muss AutoResetEvent .Set() entsprechend der Anzahl wartender Threads aufgerufen werden. Wenn kein AutoResetEvent auf &#8222;signaled&#8220; gesetzt wurde,  wird auch niemand durchgelassen. Das entspricht der Warteschlange auf \u00c4mtern oder \u00c4rzten, wo man eine Nummer ziehen muss und immer nur einer aufgerufen wird.<\/li><\/ul>\n<iframe src=\"http:\/\/www.facebook.com\/plugins\/like.php?href=https%3A%2F%2Fwww.capri-soft.de%2Fblog%2F%3Fp%3D3573&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light\" scrolling=\"no\" frameborder=\"0\" allowTransparency=\"true\" style=\"border:none; overflow:hidden; width:450px;margin-top:5px;\"><\/iframe>","protected":false},"excerpt":{"rendered":"<p>Problemfeld AutoResetEvent bietet \u00fcber einen globalen oder \u00fcbergeordneten Kontext die M\u00f6glichkeit durch den Aufruf der WaitOne-Methode innerhalb des Thread-Codes, Threads zu blockieren bis ein Signal aus einem anderem Kontext gesendet wird. Der andere Kontext sollte dabei auch Zugriff auf das steuernde AutoResetEvent-Objekt haben. Konstruktor-Parameter Ein Thread, welcher event_1.WaitOne() aufruft, blockiert nicht da signaled auf TRUE &hellip; <a href=\"https:\/\/www.capri-soft.de\/blog\/?p=3573\" class=\"more-link\"><span class=\"screen-reader-text\">C# Threads: Was bedeutet &#8222;signaled&#8220; beim AutoResetEvent-Konstruktor und im Kontext von AutoResetEvent?<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4,33,3],"tags":[274,221,275,277,276,279,278,281,282,280],"class_list":["post-3573","post","type-post","status-publish","format-standard","hentry","category-net","category-c","category-programmierung","tag-autoresetevent","tag-bedeutung","tag-konstruktor","tag-non-signaled","tag-signaled","tag-threading","tag-threads","tag-threads-blockieren","tag-threads-kontrollieren","tag-threads-steuern"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p4yGeN-VD","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3573"}],"version-history":[{"count":11,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3573\/revisions"}],"predecessor-version":[{"id":3587,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/3573\/revisions\/3587"}],"wp:attachment":[{"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.capri-soft.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}