{"id":102,"date":"2023-11-28T15:13:36","date_gmt":"2023-11-28T15:13:36","guid":{"rendered":"https:\/\/code.handwerkit.com\/?p=102"},"modified":"2025-02-20T14:29:28","modified_gmt":"2025-02-20T14:29:28","slug":"c-threads-mit-erbeniss-in-der-gui","status":"publish","type":"post","link":"https:\/\/code.handwerkit.com\/?p=102","title":{"rendered":"C# Threads und Anzeige in der GUI"},"content":{"rendered":"\n<p>Wir wollen Daten laden und nicht dass die Oberfl\u00e4che einfriert.<br>\u00dcber den Invoke Befehl kann z.B. eine WinForm Benutzerelement aktualisiert werden:<\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\"><code>\/\/Ein Button der den Thread startet:\nprivate void buttonTest_Click(object sender, EventArgs e)\n{\n            _TmfStart = DateTime.Now;\n            textBox1.Text = &quot;Start loading...&quot;;\n            textBox1.AppendText(Environment.NewLine);        \n            textBox1.AppendText(&quot;Time: &quot; + _TmfStart.ToString(&quot;mm ss f&quot;));\n\n            var thread = new Thread(new ThreadStart(getLongRun));\n            thread.Start();\n }\n\n\nprivate void getLongRun()\n        {\n            using (var db = new DatabaseContext())\n            {\n                var opt = db.artikeldatenbank.Take(50).ToList();\n                this.Invoke((MethodInvoker)delegate\n                {\n                    \/\/here can change GUI without freeze\n                    dataGridView1.DataSource = opt;\n\n                    _TmfEnd = DateTime.Now;\n                    textBox1.AppendText(Environment.NewLine);\n                    textBox1.AppendText(&quot;Time: &quot; + _TmfEnd.ToString(&quot;ss f&quot;));\n                });\n            }\n        }\n<\/code><\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>weitere M\u00f6glichkeiten eines Threads im Hintergrund:<\/p>\n\n\n\n<p> <\/p>\n\n\n\n<div class=\"hcb_wrap\"><pre class=\"prism line-numbers lang-csharp\" data-lang=\"C#\"><code>int ActivThreads = 0;\nstatic CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();\nstatic CancellationToken token = cancellationTokenSource.Token;\n\nprivate void button1ThreadStart_Click(object sender, EventArgs e)\n{            \n    TestBackgroundThread(token);\n}\n\nprivate void InvokeGUIThread(Action action)\n{\n    Invoke(action);\n}\n\nvoid TestBackgroundThread(CancellationToken cancelToken, bool bg = true)\n{\n    var thread = new Thread((ThreadStart)delegate ()\n    {\n        long count = 0;\n        while (true)\n        {\n            if (cancelToken.IsCancellationRequested)\n            {\n                return;\n            }\n            Thread.Sleep(Convert.ToInt32(textBox2.Text));\n            count++;\n            InvokeGUIThread(() =&gt;\n            {\n                textBox1.AppendText(count.ToString() + Environment.NewLine);\n            });\n\n        }\n    });\n\n    \/\/ Choose one option:\n    thread.IsBackground = bg; \/\/ &lt;--- This will make the thread run in background\n    \/*thread.IsBackground = false;*\/ \/\/ &lt;--- This will delay program termination\n\n    thread.Start();\n    ActivThreads++;           \n}\n\nprivate void button1StopAll_Click(object sender, EventArgs e)\n{\n    cancellationTokenSource.Cancel();\n    ActivThreads = 0;\n    cancellationTokenSource = new CancellationTokenSource();\n    token = cancellationTokenSource.Token;\n}<\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-media-text is-stacked-on-mobile\"><figure class=\"wp-block-media-text__media\"><img loading=\"lazy\" decoding=\"async\" width=\"540\" height=\"304\" src=\"http:\/\/code.handwerkit.com\/wp-content\/uploads\/2023\/11\/2025-02thread.gif\" alt=\"\" class=\"wp-image-122 size-full\"\/><\/figure><div class=\"wp-block-media-text__content\">\n<p>Die GUI friert nicht ein, <br>nach jedem Klick aus den Thread Start Button<br>wir ein neuer Thread gestartet und in der <br>TextBox wird in ms der Counter gesteuert.<br><br>Bei einem Klick auf Stop werden \u00fcber<br>CancelationToken alle Threads gestoppt. <\/p>\n<\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Wir wollen Daten laden und nicht dass die Oberfl\u00e4che einfriert.\u00dcber den Invoke Befehl kann z.B. eine WinForm Benutzerelement aktualisiert werden: weitere M\u00f6glichkeiten eines Threads im Hintergrund: Die GUI friert nicht ein, nach jedem Klick aus den Thread Start Buttonwir ein neuer Thread gestartet und in der TextBox wird in ms der Counter gesteuert. Bei einem &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/code.handwerkit.com\/?p=102\" class=\"more-link\"><span class=\"screen-reader-text\">&#8222;C# Threads und Anzeige in der GUI&#8220;<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[34,3],"tags":[6,31],"class_list":["post-102","post","type-post","status-publish","format-standard","hentry","category-threads","category-winform","tag-c","tag-thread","entry"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false,"post-thumbnail":false},"uagb_author_info":{"display_name":"Rooout","author_link":"https:\/\/code.handwerkit.com\/?author=1"},"uagb_comment_info":3,"uagb_excerpt":"Wir wollen Daten laden und nicht dass die Oberfl\u00e4che einfriert.\u00dcber den Invoke Befehl kann z.B. eine WinForm Benutzerelement aktualisiert werden: weitere M\u00f6glichkeiten eines Threads im Hintergrund: Die GUI friert nicht ein, nach jedem Klick aus den Thread Start Buttonwir ein neuer Thread gestartet und in der TextBox wird in ms der Counter gesteuert. Bei einem&hellip;","_links":{"self":[{"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=\/wp\/v2\/posts\/102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=102"}],"version-history":[{"count":8,"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=\/wp\/v2\/posts\/102\/revisions"}],"predecessor-version":[{"id":127,"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=\/wp\/v2\/posts\/102\/revisions\/127"}],"wp:attachment":[{"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code.handwerkit.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}