none
MultiThread Kullanımı RRS feed

  • Soru

  • Kolay gelsin arkadaşlar,

    Şuan ticari bir otomasyon yazıyorum.Yazmış olduğum otomasyonda bir çok metod vs var.Örneğin word yazma , okuma gibi vs vs birçok işlem var.Bu sebebiyle programımda ağır çalışıyor biraz performans çözüm ararken multi thread ile karşılaştım.Bende şöyle bir kod yazdım

     private void DoğrudanTeminSözleşmeliTekSatıcılıÖnTeklifFormu_Load(object sender, EventArgs e)
            {
                Thread tlonger = new Thread(KoşulluLoadDökümanYükle);
                tlonger.Start();



            }

    private void SimpleButton1_Click(object sender, EventArgs e)
            {

                Thread tlonger = new Thread(BilgileriDökümanaAktar);
                tlonger.Start();


            }

    gibi thread oluşturacak şekilde kodlar yazdım ama hata veriyor kodlar ve simple button 1 click çalışmıyor.Bunu sebebi ne olabilir?Multi thread ile nasıl performans attırabilirim.

    2 Ağustos 2019 Cuma 20:12

Yanıtlar

  • Bunlar işin temelleri ve 10 yıl dan daha eski yöntemler. .net de artık TPL (Task Parallel Library) ve asenkron (async await) programlama var. Pek tabii bu yöntemleri de kullanabilirsiniz ama eş zamanlılık problemlerini de sizin çözmeniz gerekir.

    www.cihanyakar.com

    3 Ağustos 2019 Cumartesi 07:31

Tüm Yanıtlar

  • Bunlar işin temelleri ve 10 yıl dan daha eski yöntemler. .net de artık TPL (Task Parallel Library) ve asenkron (async await) programlama var. Pek tabii bu yöntemleri de kullanabilirsiniz ama eş zamanlılık problemlerini de sizin çözmeniz gerekir.

    www.cihanyakar.com

    3 Ağustos 2019 Cumartesi 07:31
  • Cihan Bey araştırma yaptım fakat kafam deli karıştı biraz yardımcı olabilir misiniz ? task library form uygulamasına nasıl uygulanabilir mesala farklı metodlarda örnek vericek olursak
    3 Ağustos 2019 Cumartesi 17:44
  • Cihan Bey araştırma yaptım fakat kafam deli karıştı biraz yardımcı olabilir misiniz ? task library form uygulamasına nasıl uygulanabilir mesala farklı metodlarda örnek vericek olursak

    Anahtar kelimeler ile biraz daha araştırma yapın ve mantığı çözmeye çalışın derim.

    https://www.youtube.com/watch?v=B2HDDKq4d3c


    www.cihanyakar.com

    3 Ağustos 2019 Cumartesi 18:52
  • İşlemlerinizi bir metoda aktarıp Task kullanabilirsiniz. Benzer bir durumda pratik çözüm olarak zamanında kullanmıştım. 

    Task.Run(() =>
    {
    CustomMetod();
    });

    Yanlız metod içerisinde bazı kontrol mekanizmalarına ihtiyaç duyacaksınız. Özellikle Form olarak çalıştığınızı varsayarak form kontrollerinde güncelleme yapmak istediğinizde.. Bunun çözümü de aşağıdaki gibi olabilir.

    if (InvokeRequired)
        Invoke((MethodInvoker)delegate
        {
            //İşlemler....
        });

    Araştırdığınızda daha da fazlasını bulabilirsiniz..


    • Düzenleyen KaKsi 3 Ağustos 2019 Cumartesi 20:29 İmla hatası düzeltmesi
    3 Ağustos 2019 Cumartesi 20:25
  • public  void  BilgileriDökümanaAktar()
            {
                if (InvokeRequired)
                    Invoke((MethodInvoker)delegate
                    {
                        belgetarih = BelgeTarih.Value;
                        firmatanınantarih = FirmaTarih.Value;
                        if (firmatanınantarih <= belgetarih)
                        {
                            XtraMessageBox.Show("Firmaya Tanınan Tarih Belge Tarihinden Küçük Olamaz.");
                        }
                        else
                        {

                            if (BelgeTarih.Text == "" || isAdi.Text == "" || FirmaZaman.Text == "" || FirmaTarih.Text == "" || Miktar.Text == "")
                            {
                                XtraMessageBox.Show("Lütfen İlgili Alanları Doldurunuz..");
                            }
                            else
                            {
                                var application = new Microsoft.Office.Interop.Word.Application();
                                var document = new Microsoft.Office.Interop.Word.Document();
                                application.Visible = false;
                                document = application.Documents.Add(path);

                                foreach (Microsoft.Office.Interop.Word.Field field in document.Fields)
                                {
                                    if (field.Code.Text.Contains("tarih"))
                                    {
                                        field.Select();

                                        application.Selection.TypeText(BelgeTarih.Text);
                                    }
                                    else if (field.Code.Text.Contains("date"))
                                    {
                                        field.Select();
                                        application.Selection.TypeText(FirmaTarih.Text);
                                    }
                                    else if (field.Code.Text.Contains("isAdi"))
                                    {
                                        field.Select();
                                        application.Selection.TypeText(isAdi.Text);
                                    }
                                    else if (field.Code.Text.Contains("time"))
                                    {
                                        field.Select();
                                        application.Selection.TypeText(FirmaZaman.Text);
                                    }
                                    else if (field.Code.Text.Contains("yetkili"))
                                    {
                                        field.Select();
                                        application.Selection.TypeText(KullaniciGirisi.ad + KullaniciGirisi.soyad);
                                    }
                                    else if (field.Code.Text.Contains("miktar"))
                                    {
                                        field.Select();
                                        application.Selection.TypeText(Miktar.Text);
                                    }


                                }

                                document.SaveAs2(path2);
                                document.Close();
                                application.Quit();
                                XtraMessageBox.Show("Dökümanınınız Başarıyla Hazırlandı.");
                                richEditControl1.LoadDocument(path2);

                            }
                        }
                    });



            }

    butonun click eventine 

    Task.Run(() =>
                {

                    BilgileriDökümanaAktar();

                });

    şeklinde kullandım.Performans açısından nasıl bir yararı olabilir kodum çalıştı bu arada fakat değişikliği anlamadım..

                
    3 Ağustos 2019 Cumartesi 20:46
  • ...

    şeklinde kullandım.Performans açısından nasıl bir yararı olabilir kodum çalıştı bu arada fakat değişikliği anlamadım..

                
          

    Sizin birden fazla işiniz var ve normal koşullarda bu birden fazla işi teker teker yapmak zorundasınız : Önce A işi yapılır A işi bittikten sonra B işi yapılır sonra C , D...

    Thread vb size şunu sağlar : A işini yaparken B işinide yapmaya başlayabilirsiniz o sırada C işinide yapaya başlarsınız.Böylece zamandan kazanırsınız , yoksa thread içine yazdınız diye bir koddan daha fazla performans elde etmezsiniz.


    • Düzenleyen Mehmet Emin Kaymaz 3 Ağustos 2019 Cumartesi 20:59
    • Yanıt Olarak Öneren merihcan16 3 Ağustos 2019 Cumartesi 21:22
    • Yanıt Önerisini Geri Alan merihcan16 3 Ağustos 2019 Cumartesi 21:22
    3 Ağustos 2019 Cumartesi 20:57
  • Anladım Mehmet bey peki performans olarak neler yapılabilir.Thread olayları falan iş görmüyor sanırım benım yapımda hızlandırmak adına neler yapılabilir.?
    3 Ağustos 2019 Cumartesi 21:23

  • Uygulamalar Single Thread Application olarak başlar. Tek bir thread ile formlar ve kontroller(form üzerindeki textbox, label gibi nesneler) görüntülenir ve işletilir. Başlatılan Single Thread içinde bizim yaptığımız gibi "Task" kullanarak başka bir thread açtığımızda, açtığımız ikinci thread üzerinden başlangıç thread'indeki nesnelere erişmek istediğimizde direkt hata fırlatır. 

    Özellikle form üzerindeki kontroller bu konuda sıkıntılıdır. Bunun için Thread-Safe olmayan nesnelerde delegate ve eventler kullanılır. "InvokeRequired" parametresi genel olarak tüm kontrol nesnelerinde bulunmaktadır. Eğer başka bir thread üzerinden bu nesneye erişilmek istenirse true değerini verir. Açık olan formlarımızda da bu parametre mevcuttur. Form üzerindeki tüm kontroller de forma ve ana thread'e bağlı olduklarından dolayı formumuzun "InvokeRequired" parametresini kontrol ederiz. true değeri var ise Invoke işlemi uygularız. Yok ise normal bir şekilde kodumuzu uygularız. 

    Tüm bu bilgiler ışığında tek bir Invoke metodunun içerisinde tüm işlemlerinizi yapmanızın yanlış olduğunu size söylemem gerekiyor. Ayrıca bir de "InvokeRequired" true değeri gelmediğinde ne olacak buna karar vermemişsiniz.  

    field.Select();  ve  application.Selection.TypeText(FirmaTarih.Text); gibi form kontrollerine erişim gerçekleştirdiğiniz metodlar için Invoke kontrolü yapabilirsiniz. 


    • Düzenleyen KaKsi 3 Ağustos 2019 Cumartesi 21:28 İmla hatası düzeltmesi
    3 Ağustos 2019 Cumartesi 21:24
  • Pekala söylediklerinize bakıcam bu konuyu ilk görüyorum çok yabancı geliyor dedikleriniz bana ama araştırmaları devam ettiricem bişeyler ortaya çıkarabilceğimi düşünüyorum.
    3 Ağustos 2019 Cumartesi 21:29