Bunun için size iki faktör öneriyorum: - Bu tür uygulamalar için bellekte veya kalıcı bir yerde (diskte, veritabanında, regeditte) uygulamanın son işlediği veriyi tutmak ve sonrasında uygulama yeniden işlemlerine başladığında kaydedilen değeri okuyarak, programın nereden ve nasıl çalışmaya başlayacağına karar vermesi sağlanabilir.
- Programın kapatılıp açılması durumuna ilave olarak, program henüz çalışıyor iken durdurulup tekrar başlatılması durumu için ise bir bayrak tutabilir ve bu bayrağı okuyarak çalışıp çalışmayacağınıza karar verebilirsiniz.
Programınızın nasıl bir işleyişi ve görevi olduğunu bilmiyorum, fakat yukarıda bahsettiklerimi anlamanız için örnek bir sınıf yazdım.
public class Back
{
//<a href='http://www.inploid.com/t/bir-programin-yaptigi-islemleri-daha-sonra-devam-etmek-sarti-ile-durdurup-sonra-devam-ettirmek-istersek-bununla-ilgili-program-mantigini-nasil-dusunmek-ve-uygulamak-gerekir/59238/' target='_blank' title='inploid.com/t/bir-programin-yaptigi-islemleri-daha-sonra-devam-etmek-sarti-ile-durdurup-sonra-devam-ettirmek-istersek-bununla-ilgili-program-mantigini-nasil-dusunmek-ve-uygulamak-gerekir/59238/'>inploid.com/t/bir-programin-yaptigi-isle... </a>
/*
* Veritabanından bir Id değeri ile 1000'lik bloklar halinde kayıt alan bir programınızın olduğunu varsayarak sorunuza verdiğim cevabı aşağıda implemente ettim.
*/
/// <summary>
/// Bahsettiğim bayrak.
/// İlgili otomatik işlemin durumunu tutmak üzere kullandığınız değerleri içeriyor.
/// </summary>
public enum ComponentStatus
{
Unknown = 0,
Running = 1,
Paused = 2,
Stopped = 3,
Failed = 4
}
/// <summary>
/// Otomatik işleminizi yapan bileşenin şu anki durumu
/// </summary>
public ComponentStatus CurrentState { get; private set; }
/// <summary>
/// Program ne zaman kapanırsa kapansın, yaptığı işlem için kullandığı değeri kalıcı olarak tutar iseniz bu şekilde kullanabilirsiniz.
/// </summary>
public int LastRecordId { get; private set; }
/// <summary>
/// Programınızın ilk açılışta çalıştırılan metodu.
/// </summary>
public void Initialize()
{
//Burada programın işlemini devam ettirmesi için gereken son duruma ait değeri yükleyin.
//Bu örnekte ilgili değer, LastRecordId oluyor.
//Örneğin regedit'e son işlemde kullandığınız LastRecordId'i yazdığınızı varsayalım.
//Öyleyse burada, regedit'ten ilgili değeri okuyup LastRecordId'ye atayın.
}
/// <summary>
/// OnInitialize'den sonra çalışan metot
/// </summary>
public void OnStart()
{
//Gerekli son durumlar ile programınız yüklendi ve oto işlemleri burada başlatacaksınız.
if (this.CurrentState == ComponentStatus.Running) //Bir kez çalıştıktan sonra tekrar bu metodun çalışıp tekrar işlemleri başlatmasını engelle
return; //Zaten çalışıyor.
Thread autoProccessThread = new Thread(this.Do);
autoProccessThread.Start(); //Otomatik olarak yürüteceğiniz işlemi ayrı bir Thread içerisinde arka planda başlattınız.
this.CurrentState = ComponentStatus.Running; //Dolayısıyla bileşenin şu anki durumunu çalışıyor olarak değiştirmelisiniz.
}
/// <summary>
/// Otomatik olarak işlemlerinizi yaptığınız metot.
/// </summary>
public void Do()
{
while (CurrentState == ComponentStatus.Running) //Bileşen Running durumunda olduğu sürece işlemleri yapmaya devam et.
{
try
{
/*
* OnInitalize metodunda son Id değerini yüklediğimiz için,
* eğer program az önce kırıldı ve şu an tekrar çalıştırıldıysa
* bile problem olmaksızın kaldığı yerden işlemlerine devam edebilecek
*/
this.LastRecordId = this.GetLastRecordOnDb(this.LastRecordId); //Veritabanında yürüttüğünüz otomatik işlemin bu olduğunu varsayalım.
}
catch (Exception ex)
{
//Programı tekrar çalışamayacak duruma getiren kritik bir hata geldi ise
CurrentState = ComponentStatus.Failed; //Durum değişti, döngüden çıkılır. Gerekli loglamalar yapılır.
}
Thread.Sleep(100); //Her turda belli bir bekleme iyi olacaktır.
}
}
/// <summary>
/// Parametredeki Id değerinden itibaren veritabanından 1000 lik bloklar halinde kayıtları getiren bir oto metodunuz olduğunu varsayıyorum.
/// Geriye döndürdüğü değer, bir sonraki veri bloğunun hangi Id ile başladığını belirtir.
/// </summary>
/// <param name="recordId"></param>
/// <returns></returns>
private int GetLastRecordOnDb(int recordId)
{
int rvnextRecId = recordId;
//Bir takım işlemler ve sıradaki veriyi çekmek için gereken Id değerini rvnextRecId değişkenine atadınız.
return rvnextRecId;
}
/// <summary>
/// Programın kapatılma anında tetiklenen bir metot olduğunu varsayın
/// </summary>
public void OnClose()
{
//Diğer kapatma işlemleri... ...
//Programın durumunu değiştir.
this.CurrentState = ComponentStatus.Stopped; //Ayrı bir thread içerisinde oto işlemimiz sürerken, bileşen durumu bu noktada değiştiği için, ilgili arka plan işlemi (yani Do metodu) çalışmayı bitirecek.
//this.LastRecordId değerini Regedite kaydet.
}
}