En iyi yanıtlayıcılar
C# For döngüsü süresinde program donuyor.

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); } }
Yanıtlar
-
For döngüsünün sonuna this.refresh(); Dersen sorunun çözülebilir.
- Düzenleyen özcan özaltın 30 Ağustos 2016 Salı 21:31
- Yanıt Olarak İşaretleyen Bilcom Bilgisayar 30 Ağustos 2016 Salı 21:38
Tüm Yanıtlar
-
For döngüsünün sonuna this.refresh(); Dersen sorunun çözülebilir.
- Düzenleyen özcan özaltın 30 Ağustos 2016 Salı 21:31
- Yanıt Olarak İşaretleyen Bilcom Bilgisayar 30 Ağustos 2016 Salı 21:38
-
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...?
- Düzenleyen Bilcom Bilgisayar 30 Ağustos 2016 Salı 21:47 ...
-
"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.
- Düzenleyen özcan özaltın 30 Ağustos 2016 Salı 22:39
-
-
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.
-
"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ü.
-
-
Ufak bir örnekle gösterebilme şansın var mı?
https://msdn.microsoft.com/en-us/library/mt674882.aspx
https://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx
https://msdn.microsoft.com/en-us/library/dd460713(v=vs.110).aspx
-
-
-
-
Ö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.
- Düzenleyen Bilcom Bilgisayar 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.
-
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
-
Bu classı benim yapıda nasıl kullanabilirim?
Bomba diye emniyete götürmesem iyidir :)
- Düzenleyen Bilcom Bilgisayar 31 Ağustos 2016 Çarşamba 18:42 ...
-