none
C# For döngüsü süresinde program donuyor. RRS feed

  • Soru

  • Merhaba, Ben SQL Server yedekleme programı yaptım. Toplu yedekleme yapıyor. Bir Listview var logları yazdırıyorum For döngüsünde her defasında yedeklenen veritabanı bilgisini yazdırıyorum. Ancak tüm yedeklemeler bittikten sonra logların tamamını gösteriyor. Her for döngüsünde logları teker teker göstermiyor. Halbuki listview kaydırma çubuğu uzuyor ama içinde yazılar yazmıyor taa ki tüm db lerin yedeklenmesinden sonra tüm logları gösteriyor. Acaba neyi yanlış yapıyorum. 

            void kompleYedekle()
            {
                try
                {
                    notifyIcon1.ShowBalloonTip(2, "Bilcom SQL Server Yedekleme", "Tüm Veritabanları yedekleme işlemi başlıyor.",ToolTipIcon.None );
                    TumunuSec();
    
                    if (txtYedeklenecekKonum.Text.CompareTo("") == 0)
                    {
                        MessageBox.Show("Lütfen Yedeklenecek Klasörü Seçiniz.");
                        return;
                    }
                    else
                    {
                        yedekYolu = txtYedeklenecekKonum.Text;
                        Directory.CreateDirectory(yedekYolu + "\\" + String.Format("{0:yyyyMMdd}", DateTime.Now));
                        listviewYedekBilgi.Items.Add("-------------------------------------------------------------------------------------------------------");
                        for (int i = 0; i < chcklstVeritabanlari.Items.Count; i++)
                        {
                            baglanti = new SqlConnection(baglantiString);
                            baglanti.Open();
    
                            sql = "BACKUP DATABASE [" + chcklstVeritabanlari.Items[i] + "] TO DISK ='" + txtYedeklenecekKonum.Text +
                                  "\\" + String.Format("{0:yyyyMMdd}", DateTime.Now) + "\\" +
                                  chcklstVeritabanlari.Items[i] + ".bak'";
                            cmd = new SqlCommand(sql, baglanti);
                            cmd.ExecuteNonQuery();
                            listviewYedekBilgi.Items.Add(String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortDateString()) +" - "+ String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortTimeString()) + " Yedeklenen : " + chcklstVeritabanlari.Items[i]);
                            listviewYedekBilgi.EnsureVisible(listviewYedekBilgi.Items.Count - 1);
                            progressBar1.Value = i + 1;
                            int yuzde;
                            yuzde = (int)(((Double)progressBar1.Value / (double)progressBar1.Maximum) * 100);
                            progressBar1.PerformStep();
                            progressBar1.CreateGraphics().DrawString(yuzde.ToString() + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(progressBar1.Width / 2 - 10, progressBar1.Height / 2 - 7));
    
                            baglanti.Close();
                            baglanti.Dispose();
                        }
    
                        listviewYedekBilgi.Items.Add(String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortDateString()) + " - " + String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortTimeString()) + " " + "Tüm Veritabanları başarılı bir şekilde yedeklendi.");
                        listviewYedekBilgi.EnsureVisible(listviewYedekBilgi.Items.Count - 1);
    
    
    
                        if (chckYedekSikistirma.Checked)
                        {
                            listviewYedekBilgi.Items.Add(String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortDateString()) + " - " + String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortTimeString()) + " " + "Yedekler Sıkıştırılıyor. Bu işlem zaman alabilir...");
                            listviewYedekBilgi.EnsureVisible(listviewYedekBilgi.Items.Count - 1);
                            YedekSikistirma();
                        }
                        else
                        {
                            KlasorleriSil();
                        }
                    }
    
                    notifyIcon1.ShowBalloonTip(2,"Bilcom SQL Server Yedekleme", "Tüm Veritabanları başarılı bir şekilde yedeklendi.", ToolTipIcon.None);
    
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(ex.Message);
                    listviewYedekBilgi.Items.Add(String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortDateString()) + " - " + String.Format("{0:yyyyMMdd}", DateTime.Now.ToShortTimeString()) + " " + ex.Message);
                    listviewYedekBilgi.EnsureVisible(listviewYedekBilgi.Items.Count - 1);
                }
            }
    

    30 Ağustos 2016 Salı 21:11

Yanıtlar

Tüm Yanıtlar

  • For döngüsünün sonuna this.refresh(); Dersen sorunun çözülebilir.








    30 Ağustos 2016 Salı 21:27
  • Dediğin gibi yaptım oldu teşekkür ederim. Ancak bir sorunum daha var. Bu işlemleri yaparken program kitleniyor. Ne simge durumuna küçülte biliyorum ne de hareket ettirebiliyorum. Acaba bunun için ne yapmalıyım...?
    30 Ağustos 2016 Salı 21:40
  • "thread" kullanmanı öneririm bu iş için en iyi çözüm bence bu olur. yani ben olsam öyle yapardım çünkü bu işlerde çok farklı çözüm yolları olabiliyor ve çok kullanışlı bişiy.
    30 Ağustos 2016 Salı 22:39
  • ufak bir örnekle thread ı nasıl kullanacağımı söyleyebilir misin?
    30 Ağustos 2016 Salı 22:40
  • Mesela aşağıda ki program parçası benim bi programda kullandığım versiyon kontrol kodu. ben aşağıdaki kodlarla programımın versiyonunu internetten kontrol ediyordum. internetten kontrol etme sırasında programda tıpkı sizin dediğiniz gibi donma meydana geliyordu ama thread kullanınca bunların hepsi çözüldü.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Net;
    
    namespace thread_ornek
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            Thread thread1;
            string versiyon = "V0.0";
    
            private void button1_Click(object sender, EventArgs e)
            {
                thread1 = new Thread(new ThreadStart(Baslat1));
                thread1.IsBackground = true;
                thread1.Start();
            }
    
            private void Baslat1()
            {
                Uri url = new Uri("https://plus.google.com/u/0/105321396846330865164/posts/aGQGnoHRhNF");
                WebClient client = new WebClient();
                try
                {
                    string html = client.DownloadString(url);
                    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                    doc.LoadHtml(html);
                    SetText(doc.DocumentNode.SelectSingleNode("//*[@id=\"update-z12sibqhhlidivwaa04cf3po1rfxcxdhkd0\"]/div[2]/div/div[2]/div/div/div/div[2]/text()[5]").InnerText);
    
                }
                catch (Exception)
                {
    
                }
            }
    
            private void SetText(string Text)
            {
                if (this.InvokeRequired)
                    this.Invoke((Action)(() => { SetText(Text); }));
                else
                {
                    versiyon = Text;
                    if (label2.Text == versiyon)
                    {
                        label1.Text = "Versiyonunuz Güncel";
                        label1.ForeColor = Color.Green;
                    }
                    else
                    {
                        label1.Text = "Versiyonunuz Güncel Değil";
                        label1.ForeColor = Color.Red;
                    }
                }
            }
            
        }
    }
    

    Yani thread'ın genel kullanımı şöyle:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    
    namespace thread_ornek
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            Thread thread1;
    
            private void Baslat1()
            {
                //programın donmasına neden olacak kodlar.
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //thread'ın çalışmasını başlatacak kodlar.
                thread1 = new Thread(new ThreadStart(Baslat1));
                thread1.IsBackground = true;
                thread1.Start();
            }
        }
    }
    
    şimdi thread kullanırken eminim bi kaç problem yaşayacaksın o problemleri yani bir konu açıp sorarsan daha iyi olur çünkü benim bu konuda bütün bildiğim bu kadar.

    30 Ağustos 2016 Salı 23:24
  • "thread" kullanmanı öneririm bu iş için en iyi çözüm bence bu olur. yani ben olsam öyle yapardım çünkü bu işlerde çok farklı çözüm yolları olabiliyor ve çok kullanışlı bişiy.
    Doğrudan Thread kullanmadan bu iş async methodlarla veya Tasklar ile yapılabiliyorsa önce onlarla yapılmalı. Thread en son çözüm olsun. Bu HttpClient dururken Socket kullanmaya benzer çünkü.
    31 Ağustos 2016 Çarşamba 06:09
  • Ufak bir örnekle gösterebilme şansın var mı?
    31 Ağustos 2016 Çarşamba 09:31
  • kimse de dememiş ki: "döngü içinde connection açıp kapatıyon" :) 

    Yani buradaki sorun thread sorunu mudur?


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    31 Ağustos 2016 Çarşamba 10:24
    Moderatör
  • kimse de dememiş ki: "döngü içinde connection açıp kapatıyon" :) 

    Yani buradaki sorun thread sorunu mudur?


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    Forumda sık yapılan bir hatayı yaptım ve yazılan sorudaki kodu hiç okumadım... Utanıyorum...  
    31 Ağustos 2016 Çarşamba 10:37
  • iyi olmuş okumadığın :) 

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    31 Ağustos 2016 Çarşamba 10:50
    Moderatör
  • Öncelikle cevaplar için teşekkür ederim. Connection döngü içinde yapmış olmam hakikaten saçmaymış :) Peki döngü dışına çıkarınca bu tutarsızlıklar çözülür mü? Donma kasma vs.. Bazende sıkıştırma işlemine başladıktan sonra time out hatası veriyor.
    31 Ağustos 2016 Çarşamba 13:07
  • İşlem süresi kısalır ve daha doğru bir kod yazmış olursun.  Ama uzun sürüyorsa -ki backupdan söz ediyoruz- yine de o linklere tıklaman gerekecek. Onlarda da progressbarı update ettiğin yerde crossthread hatası alacağın için delegate/inovke konularınıda aradan çıkartman gerekecek.
    31 Ağustos 2016 Çarşamba 13:13
  • Bence yapacağın iş için bir model oluştur. Yani tek bir backup işlemi ne yapacağını bilsin. Sonra bunu bir listeye doldur ve hepsini ayrı threadlarda başlat. Kabaca Örneğin;

    class BackupInfo {
    
      public delegate void BackupEventHandler(BackupInfo sender);
      public event BackupEventHandler BackupCompleted();
      public event BackupEventHandler BackupChanged();
      
      public string DataBaseName { get; set; }
      public bool Hata { get; set; }
      public string Durum { get; set; } = "Bekliyor";
    }
    
    class BackupProcess : List<BackupInfo>
    {
       public string ConnectionString { get; set; }
    
       public void Start()
       {
          ...
          connection.Open();
          this.ForEach(p => 
                {
                p.Durum = "Çalışıyor";
                p.BackupChanged?.Invoke(p);
                Task.Run(()=> {
                try
                {
                  //backup işleri burada;
                  p.Hata = false;
                  p.Durum = "Tamamlandı";
                }
                catch
                {
                   p.Hata = true;
                   p.Durum = "Hata Oluştu";
                }
                finally
                {
                   p.BackupCompleted?.Invoke(p);
                }
                
             })
          );
       }  
    
    }
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    31 Ağustos 2016 Çarşamba 13:25
    Moderatör
  • Bu classı benim yapıda nasıl kullanabilirim?

    Bomba diye emniyete götürmesem iyidir :)

    31 Ağustos 2016 Çarşamba 14:12
  • bana ammyy id gönderirmisin, emailim altta


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    31 Ağustos 2016 Çarşamba 20:10
    Moderatör