none
Bu şekilde bir Timer kullanımı sistemi yorar mı? RRS feed

  • Soru

  • Herkese selam. Abilerim, ablalarım, kardeşlerim,

    Ben bir ufak projeye başladım ve internet bağlantı durumunu Ana Sayfa'da bir resim ile gösteriyorum. Form açıldığı zaman eğer internet varsa ona göre gerekli resim veya yoksa yine ona göre gerekli resim geliyor buraya kadar tamam.

    Form1 açıldığında o an internet varsa işte "OnlineConnecting" diye bir png formatlı resim geliyor ok. Ancak Internet gittiği zaman bu resim değişmiyor çünkü sadece Load olayında işlem çağırılıyor. Bende buna çözüm olarak timer'i düşünüyorum, fakat ileride program büyüdükçe bu Timer kasmaya falan sebep olur mu? yani yorar mı sistemi? Kodlarım aşağıda;

    YAZILAR İÇİN ÖZÜR DİLERİM NİYE BÖYLE KÜÇÜLDÜ ANLAYAMADIM DÜZELTEMEDİMDE :D

    Form1.cs

     public partial class IntroductionPage : Form
        {
            ConnectionStatusControl connectionStatusControl = new ConnectionStatusControl();
            public IntroductionPage()
            {
                InitializeComponent();
            }
    
            private void IntroductionPage_Load(object sender, EventArgs e)
            {
    
                StatusControlTimer();
    
                ConnectionStatusView();
            }
    
            private void StatusControlTimer()
            {
                Timer timer = new Timer();
                timer.Interval = 2000;
                timer.Tick += timer_Tick;
                timer.Start();
            }
    
            private void timer_Tick(object sender, EventArgs e)
            {
    
                ConnectionStatusView();
            }
            private void ConnectionStatusView()
            {
                try
                {
                    if (connectionStatusControl.ConnectingStatus() == true)
                    {
                        lblConnectionStatus.Location = new Point(838, 548);
                        pbOnline.Location = new Point(898, 498);
                        pbOnline.Size = new Size(40, 45);
                        lblConnectionStatus.Text = connectionStatusControl.StatusStatementTxt[0];
                        pbOnline.BackgroundImage = Image.FromFile(Path.Combine(Environment.CurrentDirectory,
                            @"images\Online-Offline\ConnectingOnline.png"));
                    }
                    else
                    {
                        pbOnline.Location = new Point(918, 490);
                        pbOnline.Size = new Size(38, 42);
                        pbOnline.BackgroundImage = Image.FromFile(Path.Combine(Environment.CurrentDirectory,
                            @"images\Online-Offline\ConnectingOffline.png"));
                        lblConnectionStatus.Location = new Point(863, 548);
                        lblConnectionStatus.Text = connectionStatusControl.StatusStatementTxt[1];
    
                    }
                }
                catch (FileNotFoundException exception)
                {
                    MessageBox.Show("Dosya yolu veya resim bulunamıyor. Kontrol etmemizi ister misin?");
                }
            }
    
        } 


    ConnectionStatusControl.cs

        //EN-> Internet connection status control.
        //TR-> Internet bağlantısı durum sorgulama.
        public class ConnectionStatusControl
        {
            //EN-> Connection status statement
            //TR-> Bağlantı durum bildirimi
            public string[] StatusStatementTxt = new string[4]
            {
                "Internet bağlantısı başarıyla kuruldu.",
                "Internet bağlantınızı kontrol edin.",
                "Connection successfully established.",
                "Check your Internet connection."
            };
            public bool ConnectingStatus()
            {
                //TR-> Eğer internet bağlantısı varsa geriye 'true' döndür.
                //EN-> If there is a connection, return the 'true' result.
                if (NetworkInterface.GetIsNetworkAvailable())
                {
                    return true;
                }
                //EN-> Otherwise, return the 'false' result.
                //TR-> Aksi takdirde, 'false' sonucunu döndür.
                else
                {
                    return false;
                }
            }
        }




    • Düzenleyen Einsatzgruppens 18 Ekim 2019 Cuma 23:10 Kod bloğu gözükmediği için ve yazılarım küçük olduğu için düzenledim.
    • Düzenleyen Önay YALÇINERModerator 19 Ekim 2019 Cumartesi 07:40 font-size: x-small
    18 Ekim 2019 Cuma 23:06

Yanıtlar

  • Bu timer bir süre sonra bir anda çalışmayı keser. Garbage Colector konusuna bir daha bak. Sorunun cevabı yormaz. Ama event base yöntem bulursan daha iyi olur. Windows bağlantı gittiğinde haber verebilir programına.

    www.cihanyakar.com

    19 Ekim 2019 Cumartesi 10:30
  • Düzeltme : 

    Bir A sınıfından türeyen B ve C sınıflarında B'de inline , C de ise constructor içerisinde tanımlanan değişkenler ve IL çıktısı :

    //Class B için 
    B..ctor:
    IL_0000:  ldarg.0     
    IL_0001:  ldc.r8      1F 85 EB 51 B8 1E 09 40 
    IL_000A:  stfld       UserQuery+B.MyPI
    IL_000F:  ldarg.0     
    IL_0010:  call        UserQuery+A..ctor
    IL_0015:  nop         
    IL_0016:  nop         
    IL_0017:  ret     
    
    //Class C için 
    C..ctor:
    IL_0000:  ldarg.0     
    IL_0001:  call        UserQuery+A..ctor
    IL_0006:  nop         
    IL_0007:  nop         
    IL_0008:  ldarg.0     
    IL_0009:  ldc.r8      1F 85 EB 51 B8 1E 09 40 
    IL_0012:  stfld       UserQuery+C.MyPI
    IL_0017:  ret 
     

    Inline durumunda önce ifade atanıyor sonra varsa base class'ın constructor'ı çağırılıyor.

    Diğer durumda ise önce base class'ın constructor'ı çağırılıyor sonra değerler atanıyor.

    "Actually it does matter. If the base class constructor calls a virtual method (which is generally a bad idea, but can happen) which is overridden in the derived class, then using instance variable initializers the variable will be initialized when the method is called - whereas using initialization in the constructor, they won't be. (Instance variable initializers are executed before the base class constructor is called.) – Jon Skeet"

    System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged += NetworkChange_NetworkAvailabilityChanged;
    
    private async void NetworkChange_NetworkAvailabilityChanged(object sender, System.Net.NetworkInformation.NetworkAvailabilityEventArgs e)
            {
                //code to execute...
            }


    Kaynak - 1

    Kaynak - 2


    19 Ekim 2019 Cumartesi 10:57

Tüm Yanıtlar

  • Bu timer bir süre sonra bir anda çalışmayı keser. Garbage Colector konusuna bir daha bak. Sorunun cevabı yormaz. Ama event base yöntem bulursan daha iyi olur. Windows bağlantı gittiğinde haber verebilir programına.

    www.cihanyakar.com

    19 Ekim 2019 Cumartesi 10:30
  • Düzeltme : 

    Bir A sınıfından türeyen B ve C sınıflarında B'de inline , C de ise constructor içerisinde tanımlanan değişkenler ve IL çıktısı :

    //Class B için 
    B..ctor:
    IL_0000:  ldarg.0     
    IL_0001:  ldc.r8      1F 85 EB 51 B8 1E 09 40 
    IL_000A:  stfld       UserQuery+B.MyPI
    IL_000F:  ldarg.0     
    IL_0010:  call        UserQuery+A..ctor
    IL_0015:  nop         
    IL_0016:  nop         
    IL_0017:  ret     
    
    //Class C için 
    C..ctor:
    IL_0000:  ldarg.0     
    IL_0001:  call        UserQuery+A..ctor
    IL_0006:  nop         
    IL_0007:  nop         
    IL_0008:  ldarg.0     
    IL_0009:  ldc.r8      1F 85 EB 51 B8 1E 09 40 
    IL_0012:  stfld       UserQuery+C.MyPI
    IL_0017:  ret 
     

    Inline durumunda önce ifade atanıyor sonra varsa base class'ın constructor'ı çağırılıyor.

    Diğer durumda ise önce base class'ın constructor'ı çağırılıyor sonra değerler atanıyor.

    "Actually it does matter. If the base class constructor calls a virtual method (which is generally a bad idea, but can happen) which is overridden in the derived class, then using instance variable initializers the variable will be initialized when the method is called - whereas using initialization in the constructor, they won't be. (Instance variable initializers are executed before the base class constructor is called.) – Jon Skeet"

    System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged += NetworkChange_NetworkAvailabilityChanged;
    
    private async void NetworkChange_NetworkAvailabilityChanged(object sender, System.Net.NetworkInformation.NetworkAvailabilityEventArgs e)
            {
                //code to execute...
            }


    Kaynak - 1

    Kaynak - 2


    19 Ekim 2019 Cumartesi 10:57
  • Teşekkürler Cihan hocam, düzenlemelere başlıycam :) Şu programlamada zaten en sevmediğim konulardan birisi Garbage Colector veya Referans Tipler. Akşama detaylıca bakıcam,  hem defterimdeki konuya hemde 1-2 kaynağa.
    19 Ekim 2019 Cumartesi 11:19
  • Teşekkür Ederim Mehmet Emin hocam, ben ilk defa bir proje yazmaya başladım, öğretmenlerin verdiği ödevleri yapmaktan zaman kalmıyordu. Düzelticem hocam bugün. Sormak istediğim şu, yazmış olduğum kod'un karışıklık dışında herhangi bir zararı var mıdır?
    19 Ekim 2019 Cumartesi 11:23
  • Teşekkür Ederim Mehmet Emin hocam, ben ilk defa bir proje yazmaya başladım, öğretmenlerin verdiği ödevleri yapmaktan zaman kalmıyordu. Düzelticem hocam bugün. Sormak istediğim şu, yazmış olduğum kod'un karışıklık dışında herhangi bir zararı var mıdır?

          Inline tanımlamada karışıklıktan kast ettiğim performans sorunuydu aslında , timer'ı sorguladığınızı görünce bende öğrendiğim bir şeyi paylaşayım dedim.

         Ona ek olarak eğer bir sınıf ondan türeyecek sınıflara sahip olmayacaksa sealed olmalı : 

         
    sealed class Deneme{ //örnek
    
    
    }
         Hepsine ek olarak winform yerine WPF tercih ederdim onuda MVVM'a uygun kullanmaya çalışırdım.Hem daha güzel gözüken uygulamalar ortaya çıkıyor hemde kod kalabalığı ortadan kalkıyor.Örneğin window üzerinden bir textbox'ı silip yerine combobox koyduğunda kodda bir değişiklik yapman gerekmiyor.
    19 Ekim 2019 Cumartesi 12:37
  • Teşekkürler Cihan hocam, düzenlemelere başlıycam :) Şu programlamada zaten en sevmediğim konulardan birisi Garbage Colector veya Referans Tipler. Akşama detaylıca bakıcam,  hem defterimdeki konuya hemde 1-2 kaynağa.
    C, C++ kullan o zaman. Ayrıca listedeki maddeleri sırayla gitmeni öneririm. 

    www.cihanyakar.com

    19 Ekim 2019 Cumartesi 22:08