C# Console uygulamasında timer tetiklenme fonksiyonuna parametre eklemek

CrevZZ

Hectopat
Katılım
9 Temmuz 2020
Mesajlar
142
Merhabalar, C# Console uygulamasında bir timer ekledim. Şimdi bu timer her tetiklendiğinde çalışacak metot içine parametreler eklemek istiyorum fakat nasıl ekleyeceğimi bilmiyorum. Kod olarak ekleyip sorumu daha net açıklayayım.

C#:
class Functions.
{
public System.Timers.Timer aTimer;
public void SetTimer()
{
aTimer = new System.Timers.Timer(200);
aTimer.Elapsed += ATimer_Elapsed; //sanırım burada metodu eklerken bir şeyler yapmam lazım.
}

public void ATimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e, ref string direction) //Timer her tetkilendiğinde çalışacak metot içine string bir değişkeni parametre olarak eklemek istiyorum.
{
Moving(ref direction);
}

public void Moving(ref string direction)
{
//parametre ile gelen string değişken ile ilgili işlemler yapılacak.
}
}

Şimdi timer her tetiklendiğinde "moving" isimli metodu çalıştırmak istiyorum, fakat "moving" isimli metot string bir değişkeni parametre alarak içerisinde işlemler yapıyor. Bunu nasıl istediğim şekilde ekleyebilirim?
 
Son düzenleyen: Moderatör:
Kodumun daha anlaşılabilir olması için using System.Timers; kullanmadım.

C#:
static System.Timers.Timer zamanlayici = new System.Timers.Timer(1000); // Her 1000 milisaniyede bir tetiklenecek zamanlayıcı(timer) oluşturduk.
static int rakam = 0; // Sizinkine benzemesi için 'direction' yerine bir 'rakam' değişkeni oluşturdum.

static void Main(string[] args)
{
    Console.WriteLine("Timer başlatılıyor.");
    zamanlayici.Elapsed += zamanlayici_Elapsed; // Burada her tetiklendiğinde hangi metodu kullanacağını gösteriyoruz.
    zamanlayici.Start(); // Sanırım sizin kodunuzda burası eksikti. Burada timer'ı çalıştırıyoruz.
    Console.Read(); // Uygulamamızın kapanmaması için ben Console.Read(); ekledim.
}

static void zamanlayici_Elapsed(object sender, System.Timers.ElapsedEventArgs e) // Timer tetiklendiğinde kullanılan metodun 'static' olması gerekiyor.
{
    Herhangi_Bir_Metod(ref rakam);
    Console.WriteLine($"Elinizdeki sayı: {rakam}");
}

static int Herhangi_Bir_Metod(ref int kullanilacakDegisken) // Bu kullandığınız metodun da 'static' olması gerekiyor yoksa zamanlayici_Elapsed gibi yerlerin içinde kullanamıyorsunuz.
{
    rakam += 1;
    return kullanilacakDegisken;
}

Çıktı(Output):
timer.png

diye sonsuza kadar devam ediyor...

Elimden geldiğinde anlaşılabilir olmaya çalıştım. Herhangi bir sorunuz olursa sormaktan çekinmeyin.

İyi çalışmalar dilerim.
 
Son düzenleme:
Kodumun daha anlaşılabilir olması için using System.Timers; kullanmadım.

C#:
static System.Timers.Timer zamanlayici = new System.Timers.Timer(1000); // Her 1000 milisaniyede bir tetiklenecek zamanlayıcı(timer) oluşturduk.
static int rakam = 0; // Sizinkine benzemesi için 'direction' yerine bir 'rakam' değişkeni oluşturdum.

static void Main(string[] args)
{
    Console.WriteLine("Timer başlatılıyor.");
    zamanlayici.Elapsed += zamanlayici_Elapsed; // Burada her tetiklendiğinde hangi metodu kullanacağını gösteriyoruz.
    zamanlayici.Start(); // Sanırım sizin kodunuzda burası eksikti. Burada timer'ı çalıştırıyoruz.
    Console.Read(); // Uygulamamızın kapanmaması için ben Console.Read(); ekledim.
}

static void zamanlayici_Elapsed(object sender, System.Timers.ElapsedEventArgs e) // Timer tetiklendiğinde kullanılan metodun 'static' olması gerekiyor.
{
    Herhangi_Bir_Metod(ref rakam);
    Console.WriteLine($"Elinizdeki sayı: {rakam}");
}

static int Herhangi_Bir_Metod(ref int kullanilacakDegisken) // Bu kullandığınız metodun da 'static' olması gerekiyor yoksa zamanlayici_Elapsed gibi yerlerin içinde kullanamıyorsunuz.
{
    rakam += 1;
    return kullanilacakDegisken;
}

Çıktı(Output):
Eki Görüntüle 804548
diye sonsuza kadar devam ediyor...

Elimden geldiğinde anlaşılabilir olmaya çalıştım. Herhangi bir sorunuz olursa sormaktan çekinmeyin.

İyi çalışmalar dilerim.

Kullanacağım metotların static olması gerektiğini bilmiyordum, çok teşekkür ederim. Eve gidince deneyeceğim, takıldığım bir yer olursa tekrardan rahatsız ederim sizi :)
 
Zaten static yapmazsanız aTimer.Elapsed += ATimer_Elapsed; satırına derleyicinizin CS0120 hatası vermesi gerekiyor diye biliyorum.

Her şeyi anladım da bir yerde sıkıntı yaşıyorum. Şimdi yazdığınız örnekte main fonksiyon dışında bir değişken tanımlamışsınız. Bu sayede class içindeki tüm metotlar parametre gerektirmeden o değişkene erişebiliyor. Peki ya main fonksiyon içinde tanımlamış olduğum bir değişkeni nasıl parametre olarak ekleyebilirim timerın tetkilendiği metota?
 
Neden böyle bir şey yapmaya çalıştığınızı anlayamadım.

Bu atadığımız değişkenlere biz Global Variables diyoruz ve bunlar metodların dışarısına yazılırlar. Metodların içerisine yazılanlar sadece onların içerisinde kullanılabilir. Eğer birden fazla metodun içerisinde bunu kullanacaksanız dışarıda yazmanız gerekmektedir.

Ne yapmak istediğinizi biraz daha açarsanız yardımcı olmaya çalışırım. Neden dışarısı yerine içeriyi tercih ediyorsunuz mesela?
 
Neden dışarısı yerine içeriyi tercih ediyorsunuz mesela?

Öncesinde main fonksiyonda tanımlayıp tüm metotları ona göre ayarladığım için aynı şekil devam etmek istemiştim. Şimdi main fonksiyon içindeki değişkenleri global yere taşıyıp tüm metotlarda değişiklik yapmak yerine aynı şekilde yine main fonksiyonda bulunan değişkenleri parametre ile gönderip yapmak istemiştim. Ama olmuyorsa eğer sıkıntı yok, Main fonksiyondaki değişkenleri global yere aktarıp tüm metotlarda ona göre değişiklik yaparım. Sadece daha öncesinde hiç global yere değişken atamadığım için demiştim.
Teşekkür ederim bu arada tekrardan.
 

Yeni konular

Geri
Yukarı