Bir sistem yazdım.
İşlem sırasında iken yazılımın donmamasını istiyorum. Bunu Async ve Thread ila halledebiliyorum. Fakat for ile yapınca durdur devam et gibi şeyler yapamıyorum.
Timer ile yapayım dedim, durdur başlat olayı iyi olur dedim. Sırası ile açacağına thread veya async start verdiğiniz anda timer çalıştıka açıyor. Thread da lock ettim fakat bu seferde hata veriyor bir müddet sonra.
Bana işlem yapılırken yazılım donmayacak, durdur başlat yapabileceğim bir öneri lazım. Var ise böyle bir öneriniz, çok minnet duyarım.
(Form Application Geliştiriyorum)
C# durdur başlat
9
●972
- 30-10-2019, 21:20:32
- 30-10-2019, 22:51:56BackgroundWorker nesnesi ile kolayca yapabilirsiniz. Visual Studio Toolbox içindeki components kısmında BackgroundWorker nesnesini alıp forma sürükleyin.
daha sonra global bir değişken tanımlayın :
bool isStop=false;
daha sonra durdurma butonunun click eventine şu şekilde bir kod ekleyin :
private void btnDurdur_Click(object sender, EventArgs e)
{
// meşgül değilse gerek yok işleme pas geçiyoruz
if (!backgroundWorker1.IsBusy)
{
return;
}
Button btn= sender as Button;
btn.Enable=false;
isStop=true;
}
daha sonra DoWork methodu içine şu şekilde bir kontrol yerleştirin :
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// sizin döngünüzün başına böyle bir if yerleştirin.
while(true)
{
if (isStop)
{
break;
}
// uzun kodların çalıştığı blok
}
}
daha sonra RunWorkerCompleted methodu içinde durdurma butonunu ve global değişkeni restore edin
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
isStop=false;
btndurdur.Enable=true;
} - 30-10-2019, 22:56:31Teşekkür ederim. BackGroundWorker bakmıştım. Yapısını ters bulduğum için fazla girmemiştim o konuya. Dediğinizi deneyeceğim, tekrardan teşekkür ederim.mpurvis adlı üyeden alıntı: mesajı görüntüle
- 31-10-2019, 01:33:40rica ederimmustafadgr adlı üyeden alıntı: mesajı görüntüle
bgworker windows form için tasarlandığından gönül rahatlığıyla kullanabilirsiniz. aynı işlemi Task sınıfı ile de yapabilirsiniz. küçük bir senkronizasyon eklemesi ile. işte örnek :
bool isStop = false; private void btnDurdur_Click(object sender, EventArgs e) { btnDurdur.Enable = false; btnDurdur.Text = "Bekleyiniz ..."; isStop = true; } private void arkaPlan() { Task task = Task.Factory.StartNew(() => { // while ya da for sizin döngünüz while (true) { if (isStop) { break; } // burda yapılan her işlemden sonra yine if (isStop) kontrolü edilebilir. // amaç her işlemden sonra mutlaka isStop u kontrol etmek. // zira burdaki işlem bitmeden isStop kontrol edilmeyeceği için durdurma işlemi işin bitişine göre değişkenlik gösterecektir. } }).ContinueWith((t) => { // burası UI güvenli bölge yani ana uygulama thread bölgesi. btnDurdur.Enable = true; btnDurdur.Text = "DURDUR"; isStop = false; }, TaskScheduler.FromCurrentSynchronizationContext()); } - 31-10-2019, 18:49:38Bunu diğer yöntemler ile de yapabiliriz,durdurup kaldığı yerden devam etmesini sağlamam lazım. Sanırım bu şekilde kontrol sağlayarak yapmak gerek. Başka çare yokmpurvis adlı üyeden alıntı: mesajı görüntüle
- 31-10-2019, 21:18:55hocam otomatik belli bir süre bekleyip sonra devam etmesini mi istiyorsunuz? yoksa programi durdurup kapattiktan sonra tekrar açılınca kaldığı yerden çalışmasını mı?mustafadgr adlı üyeden alıntı: mesajı görüntüle
- 31-10-2019, 21:20:57İşlem yaparken döngüden çıkmadan duracak, devam et dediğimizde kaldığı yerden devam edecek.mpurvis adlı üyeden alıntı: mesajı görüntüle
- 31-10-2019, 22:27:00o zaman thread sleep yaparsaniz döngü icinde olur. ana ui thread i olmadığı için arka planda kendi kanalinda bekler. döngü içine bu şekilde bir ekleme yaparsaniz işleminiz askida bekler sure dolunca devam eder.mustafadgr adlı üyeden alıntı: mesajı görüntüle
Thread.Sleep(2000);
bgworker windows form için tasarlandığından gönül rahatlığıyla kullanabilirsiniz. aynı işlemi Task sınıfı ile de yapabilirsiniz. küçük bir senkronizasyon eklemesi ile. işte örnek :