﻿
{"id":4658,"date":"2016-07-02T05:42:16","date_gmt":"2016-07-02T05:42:16","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4658"},"modified":"2016-07-02T05:42:16","modified_gmt":"2016-07-02T05:42:16","slug":"cta-bir-is-parcacigini-farkli-bir-is-parcaciginda-denetlemek","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-bir-is-parcacigini-farkli-bir-is-parcaciginda-denetlemek\/","title":{"rendered":"C#&#8217;ta Bir \u0130\u015f Par\u00e7ac\u0131\u011f\u0131n\u0131 Farkl\u0131 Bir \u0130\u015f Par\u00e7ac\u0131\u011f\u0131nda Denetlemek"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Ge\u00e7enlerde \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m bir oyun(Sudoku) projesinde ald\u0131\u011f\u0131m hatadan sizlere bahsetmek istiyorum.<\/p>\n<p style=\"text-align: center;\"><span style=\"color: #ff0000;\"><em><strong>An exception of type &#8216;System.ArgumentException&#8217; occurred in System.Windows.Forms.dll but was not handled in user code<\/strong><\/em><\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"color: #ff0000;\"><em><strong>Additional information: Bir i\u015f par\u00e7ac\u0131\u011f\u0131nda olu\u015fturulan denetimler, farkl\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131ndaki denetimin \u00fcst \u00f6\u011fesi yap\u0131lamaz.<\/strong><\/em><\/span><\/p>\n<p>Al\u0131nan hatan\u0131n g\u00f6rsel hali a\u015fa\u011f\u0131daki gibidir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Cta-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131n\u0131-Farkl\u0131-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131nda-Denetlemek.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Cta-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131n\u0131-Farkl\u0131-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131nda-Denetlemek-300x77.png\" alt=\"C#&#039;ta Bir \u0130\u015f Par\u00e7ac\u0131\u011f\u0131n\u0131 Farkl\u0131 Bir \u0130\u015f Par\u00e7ac\u0131\u011f\u0131nda Denetlemek\" width=\"300\" height=\"77\" class=\"aligncenter size-medium wp-image-4659\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Cta-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131n\u0131-Farkl\u0131-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131nda-Denetlemek-300x77.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Cta-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131n\u0131-Farkl\u0131-Bir-\u0130\u015f-Par\u00e7ac\u0131\u011f\u0131nda-Denetlemek.png 446w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Bu i\u00e7eri\u011fimizde bu hatan\u0131n as\u0131l sebebinden bahsedecek, bunun yan\u0131nda \u015fahsen nerede ald\u0131\u011f\u0131m\u0131, hangi durumlarda kar\u015f\u0131m\u0131za \u00e7\u0131kabilece\u011fine de\u011finece\u011fim.<\/p>\n<p>Tabi ki de \u00f6ncelikle hatam\u0131z\u0131 tan\u0131mlamakla i\u015fe ba\u015flayal\u0131m.<br \/>\nBu hata, birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131(Thread) \u00fczerinde \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131 zamanlarda Thread&#8217;lar\u0131n birbirlerine m\u00fcdahale etmesi sonucu ve hatadanda anla\u015f\u0131laca\u011f\u0131 \u00fczere bir i\u015f par\u00e7ac\u0131\u011f\u0131 i\u00e7erisindeki i\u015flevi farkl\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131 i\u00e7erisinde devreye sokmaktan kaynaklanmakta ve al\u0131nmaktad\u0131r.<\/p>\n<p>&#8220;Bu hatayla sen nas\u0131l bir durumda kar\u015f\u0131la\u015ft\u0131n?&#8221; diye sorarsan\u0131z e\u011fer<br \/>\nAsenkron bir yakla\u015f\u0131m sergilemeye \u00e7al\u0131\u015f\u0131rken olu\u015fturdu\u011fum yap\u0131lar birazdan a\u015fa\u011f\u0131da g\u00f6sterece\u011fim gibi farkl\u0131 i\u015f par\u00e7ac\u0131klar\u0131n\u0131 birbirlerine harmanlar vaziyetteydi.<\/p>\n<p>\u00d6rne\u011fin a\u015fa\u011f\u0131daki gibi bir forma eleman ekleme durumunu ele al\u0131rsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void Form1_Load(object sender, EventArgs e)\r\n        {\r\n            ControlEkle();\r\n        }\r\n\r\n        Task ControlEkle()\r\n        {\r\n            return Task.Run(() =&gt;\r\n            {\r\n                Label lblOrnek = new Label();\r\n                lblOrnek.Name = &quot;lblOrnek&quot;;\r\n                lblOrnek.Text = &quot;\u00d6rnek Label&quot;;\r\n                this.Controls.Add(lblOrnek);\r\n            });\r\n        }\r\n<\/pre>\n<p>ControlEkle metodu ile forma y\u00fcklemeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m bir Control nesnesini s\u00fcre\u00e7te asenkron bir yap\u0131da kullanabilmek i\u00e7in Task imzal\u0131 bir metodla geriye ayn\u0131 tipte nesne d\u00f6rd\u00fcrmeye \u00e7al\u0131\u015f\u0131rken i\u00e7erisinde yap\u0131lan bu i\u015flemler olas\u0131 ilgili hatay\u0131 vermektedirler. Haliyle ControlEkle metodu Form1_Load event\u0131nda \u00e7a\u011fr\u0131ld\u0131\u011f\u0131 anda ana Thread&#8217;a m\u00fcdahale s\u00f6z konusu olacak ve biryandan da bu ana Thread&#8217;da ki \u00f6ncelikli i\u015flem Task.Run() metodu i\u00e7erisinde bulunan forma Control ekleme komutlar\u0131 olacakt\u0131r. Eee this.Controls.Add() ayr\u0131 bir Thread oldu\u011fundan dolay\u0131 olay kar\u0131\u015facak ve program patlayacakt\u0131r.<\/p>\n<p>Tabi \u00f6ncelikle bu i\u015flemlerde bu hatay\u0131 alabilmek yani farkl\u0131 i\u015f par\u00e7ac\u0131klar\u0131n\u0131 birbirleri denetiminde harmanlamak i\u00e7in \u00f6ncelikle <a href=\"http:\/\/www.gencayyildiz.com\/blog\/c-capraz-is-parcacigi-islemi-gecerli-degil-hatasi-ve-cozumu\/\" target=\"_blank\">Control.CheckForIllegalCrossThreadCalls = false<\/a> komutunu devreye sokman\u0131z gerekmektedir.<\/p>\n<p>Benzer \u015fekilde ayn\u0131 i\u015flemi delege kullanarak ger\u00e7ekle\u015ftirirsek e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void Form1_Load(object sender, EventArgs e)\r\n        {\r\n            MetodHandler metod = new MetodHandler(ControlEkle);\r\n            metod.BeginInvoke(new AsyncCallback((x) =&gt; { }), this);\r\n        }\r\n        delegate void MetodHandler();\r\n        void ControlEkle()\r\n        {\r\n            Label lblOrnek = new Label();\r\n            lblOrnek.Name = &quot;lblOrnek&quot;;\r\n            lblOrnek.Text = &quot;\u00d6rnek Label&quot;;\r\n            this.Controls.Add(lblOrnek);\r\n        }\r\n<\/pre>\n<p>benzer \u015fekilde delege nesnesi i\u00e7erisinde belirlenen ControlEkle metodu farkl\u0131 bir Thread&#8217;da \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rken, i\u00e7erisindeki this.Controls.Add() komutu farkl\u0131 bir Thread&#8217;\u0131 temsil etmekte ve gene olas\u0131 hatayla kar\u015f\u0131la\u015f\u0131lmaktad\u0131r.<\/p>\n<p>Tabi ki de ilgili \u00f6rnekleri \u00e7o\u011faltabilir ve \u00f6rnek olaylar\u0131 geni\u015fletebiliriz. Ama fark\u0131na vard\u0131ysan\u0131z genellikle asenkron yap\u0131lanmalara yatk\u0131n olarak hata seyretmektedir.<\/p>\n<p>Mesele Thread s\u0131n\u0131f\u0131 arac\u0131l\u0131\u011f\u0131ylada asenkron temelli son bir \u00f6rnek sunarsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void Form1_Load(object sender, EventArgs e)\r\n        {\r\n            Thread trd = new Thread(new ThreadStart(ControlEkle));\r\n            trd.Start();\r\n        }\r\n        void ControlEkle()\r\n        {\r\n            Label lblOrnek = new Label();\r\n            lblOrnek.Name = &quot;lblOrnek&quot;;\r\n            lblOrnek.Text = &quot;\u00d6rnek Label&quot;;\r\n            this.Controls.Add(lblOrnek);\r\n        }\r\n<\/pre>\n<p>senaryosunda da hatayla kar\u015f\u0131la\u015f\u0131lacakt\u0131r.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, farkl\u0131 i\u015f par\u00e7ac\u0131klar\u0131n\u0131n birbirlerine kar\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131 yakla\u015f\u0131mlarda bu olas\u0131 hata bir aktivasyon g\u00f6stermekte ve i\u015flevler yerine getirilmemektedir.<\/p>\n<p><strong>Peki bu olas\u0131 hatay\u0131 nas\u0131l \u00e7\u00f6zebiliriz?<\/strong> sorusunun cevab\u0131na gelirsek e\u011fer, art\u0131k hangi Control eleman\u0131n\u0131 kullan\u0131yorsak o elemana yap\u0131lan ba\u015fvurunun bulundu\u011fu i\u015f par\u00e7ac\u0131\u011f\u0131ndan m\u0131? yoksa farkl\u0131 i\u015f par\u00e7ac\u0131\u011f\u0131ndan m\u0131? yap\u0131ld\u0131\u011f\u0131n\u0131 kontrol etmemiz yeterlidir.<\/p>\n<p>BU i\u015flem i\u00e7in a\u015fa\u011f\u0131daki kod blo\u011funu inceleyeliniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        private void Form1_Load(object sender, EventArgs e)\r\n        {\r\n            ControlEkle();\r\n        }\r\n\r\n        Task ControlEkle()\r\n        {\r\n            return Task.Run(() =&gt;\r\n            {\r\n                Label lblOrnek = new Label();\r\n                lblOrnek.Name = &quot;lblOrnek&quot;;\r\n                lblOrnek.Text = &quot;\u00d6rnek Label&quot;;\r\n                if (this.InvokeRequired) \/\/Forma gelen talebin farkl\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131ndan gelip gelmedi\u011fi kontrol ediliyor.\r\n                {\r\n                    \/\/E\u011fer farkl\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131ndan talep gelmi\u015fse a\u015fa\u011f\u0131daki Invoke metoduyla i\u015flem ger\u00e7ekle\u015ftiriliyor.\r\n                    this.Invoke((MethodInvoker)delegate ()\r\n                    {\r\n                        this.Controls.Add(lblOrnek);\r\n                    });\r\n                }\r\n            });\r\n        }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi InvokeRequired propertysi ilgili Control eleman\u0131na gelen talebin farkl\u0131 bir i\u015f par\u00e7ac\u0131\u011f\u0131ndan olup olmad\u0131\u011f\u0131 bilgisini verirken, Invoke metodu arac\u0131l\u0131\u011f\u0131yla da farkl\u0131 i\u015f par\u00e7as\u0131ndan gelen talep o nesne \u00fczerinde tetiklenmektedir.<\/p>\n<p>Ayn\u0131 y\u00f6ntemi di\u011fer \u00f6rnek olaylar \u00fczerinde de uygularsan\u0131z olas\u0131 hatan\u0131n a\u015f\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<p>\u0130\u015fte asenkron yakla\u015f\u0131ml\u0131 uygulamalarda bu tarz bir hatayla kar\u015f\u0131la\u015fman\u0131n en basit ve kesin \u00e7\u00f6z\u00fcm\u00fc bu \u015fekilde ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Ge\u00e7enlerde \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m bir oyun(Sudoku) projesinde ald\u0131\u011f\u0131m hatadan sizlere bahsetmek istiyorum. An exception of type &#8216;System.ArgumentException&#8217; occurred in System.Windows.Forms.dll but was not handled in user code Additional information: Bir i\u015f par\u00e7ac\u0131\u011f\u0131nda olu\u015fturulan denetimler,&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[1318,1316,1317,1235],"class_list":["post-4658","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-invoke","tag-invokerequired","tag-methodinvoker","tag-thread"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4658","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=4658"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4658\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4658"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4658"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4658"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}