14 Haziran 2013 Cuma

ASP.NET MultiThreading basit kullanımı


Bir önceki postumda paylaştığım triggerlarımda bir sorun yaşayacağımı düşünüp(daha doğrusu müdürüm tarafından düşündürülüp :) ) bu sorunu test etmek için daha önce sadece adını duyduğum multithreading programlamaya başlangıç seviyesinde, basit bir giriş yaptım. Ne işe yaradığını anladım, kullanımı konusunda ise sıkıntı yaşadığımı itiraf etmeliyim.. Hatta ne kadar sıkıldıysam bir ara küçük emraha bağlamış olacağım ki müdürüm duygusal fon müziği de vereyim mi diye yorum yapma gereği duydu saklayamadığım mimiklerime .. :)  Neyse kullandım kullanmasına ama hala kullanımı havada benim için.. 

Durumu özetledikten sonra, önce neden triggerlarımda sorun yaşayabiliritem olduğunu, sonra da bunu multitheadingle nasıl test ettiğimi açıklarım şeklinde yazı algoritmamı kurayım ve yazmaya başlayayım. :)

Triggerlarımda bir tablomda -A tablosu diyeyim- update işlemi yaparken başka bir tablomda  -B tablosu diyeyim- daha update işlemi yapan bir trigger var. Ancak B tablosunda da kendine ait bir UPDATE triggerı var. Yani A tablomun UPDATE trigger ı B tablosunun da triggerını tetikliyor,, ben ise bunu istemiyorum. Bu yüzden A tablomdaki triggerda B tablosunun triggerını DISABLE-ENABLE etme yoluna gittim.. Herşey güzel çalışıyor gibi görünüyor. Ancak; ya aynı anda iki tabloya da update işlemi gelirse, B tablosunun triggerını DISABLE ettiğim anda çalışması gerekirken çalışmazsa?

Yukarıdaki paragrafı muhtemelen sadece ben okuyunca anlarım :D Neyse zaten burda ben beneyim.. 

Sonuç olarak bunu test etmek için ne yapmalı, aynı anda iki update işlemi yapmalı. Aynı anda iki işi yapmak demek multithreading demek. O zaman basit bir multithreading projesi yapıp en kısa yoldan bunu test edelim. 

Program olabilecek en basit program. Bir butonum var, butona tıkladığımda sqle iki update işlemi gönderiyor... Kodlarım;


        protected void Button1_Click(object sender, EventArgs e)
        {


            System.Threading.ThreadStart t_baslat1;
            System.Threading.ThreadStart t_baslat2;

            System.Threading.Thread t1;
            System.Threading.Thread t2;

            t_baslat1 = new System.Threading.ThreadStart(ThreadA);
            t_baslat2 = new System.Threading.ThreadStart(ThreadB);

            t1 = new System.Threading.Thread(t_baslat1);
            t2 = new System.Threading.Thread(t_baslat2);

            t1.Start();
            t2.Start();


        }

public void ThreadA()
        {

            Harmony_v3Entities harmono = new Harmony_v3Entities();
            var asset = harmono.VDB_ASSETS.Single(p => p.GUID.Equals(new Guid("CD6577C5-9FCF-4B86-974F-D8297EF3C993"))); //grid

            asset.PRM0 = "GridMng_Transforming";
            harmono.SaveChanges();
        }


        public void ThreadB()
        {

            Harmony_v3Entities harmono = new Harmony_v3Entities();
            var info = harmono.VDB_ASSET_INFORMATIONS.Single(p => p.GUID.Equals(new Guid("B04055CC-B395-4103-9FCC-317DB2DAAE6B")));

            info.GUID_USER = Guid.NewGuid();
            harmono.SaveChanges();

        }


Bu kadar.. 
Örneği şu linkten aldım, arkadaş diğer blogların aksine çok basit ve eğlenceli anlatmış. Kendisine teşekkürü borç bilirim.. İşte linki:

İşlemin sonucunda dediğimiz gibi bir trigger çalışmama durumuyla karşılaşmadık.. Arka tarafta ne oluyor ne bitiyor, neden öyle bir sorunla karşılaşmadık bilmiyorum. Bilmek isterdim. Belki daha sonra..

Kolay gelsin bana ve cinlerime :)


Hiç yorum yok:

Yorum Gönder