Estikçe yazıyor…
16 AÄŸu
Eğer C# ile Multi-Threading bir uygulama yapıyorsanız karşınıza çıkması muhtemel bir hatadır.
Bir form oluÅŸturursanız o form ve elemanları main thread tarafından oluÅŸturulur ve farklı bir thread’den form elemanlarına ulaÅŸamazsınız.
Örnekleyecek olursak; client-server(istemci-sunucu) haberleÅŸmsine dayanan bir program yazıyorsunuz. Server’dan bir haber gelince ona göre client formunda birÅŸeyleri deÄŸiÅŸtirmek istediniz.
Mesela  “label1.visible= true”
İşte tam bu noktada şöyle bir exception ile karşılaşacaksınız:
Cross-thread operation not valid: Control ‘ClientForm’ accessed from a thread other than the thread it was created on.
Peki bunu nasıl çözeriz?
Bu sorunu aÅŸmak için C#’ın delegate yapısını kullanacağız.
Bu kod parçacığı label1 isimli form kontrolümüzün görünürlülüğünü farklı thread üzerinden değiştirmemizi sağlıyor.
Ancak eÄŸer ki ” kardeÅŸim iyi de ben birçok ÅŸeyi deÄŸiÅŸtireceÄŸim, her biri için ayrı ayrı bundan yazmam mı gerekir” derseniz, sizin için de şöyle bir çözümümüz mevcut.
Burada da delegeta yapımıza ve fonksiyonumuza üzerinde değişiklik yapmak istediğimiz Control yapısını da verdik. Böylece form üzerindeki istediğimiz yapının visibility ayarını farklı bir thread üzerinden değiştirebiliriz.
Tabi bu sadece visibility ile sınırlı deÄŸil, ister text’ini deÄŸiÅŸtirin ister farklı bir özelliÄŸini, o zaman yapmanız gereken bool olarak le aldığımız argümanı deÄŸiÅŸtireceksiniz bir de
cont.Visible = vis;
yazan kısmı, ne yapmak istiyorsanız onunla değiştireceksiniz.
Hadi bakalım bu kadar gevezelik yeter, biraz da çalışalım…
"C# “Cross-Thread Operation” Sorunu" için 6 Cevap
Benim her multithreaded C# uygulamamda bu basima gelir, genelde de Release Modda hata cikarmaz, ben de pek ugrasmadan gecerim
Eyvallah guzel olmus yazi.
Hadi ya hep debug modda çalıştığım için bunu hiç farketmemiştim bak.
Evet kullanıcı kipi iÅŸlemler (process’ler) birden çok thread (iplikçik) içerebilirler ve bunların içerikleri (contex’leri) farklı olduÄŸundan birbirlerinin bellek içeriklerine eriÅŸimleri derleyicinin saÄŸlayabileceÄŸi bir senkronizasyon ve adresleme ile olabilir burada delegate öntakısı ile c# buna olanak tanır (cf. Kernel mode programming: thread contexts and context swapping)
güzel çözüm
Bu kıymetli bilgileri paylaştığın için teşekkürler.
Rica ederim. Hepimiz takıldığımız yerleri çözdüğümüzde anlatalım ki ortaya bir bilgi birikimi çıksın.
Yorum yap