2010-06-12 11 views
8

Bazı web sitelerini bir döngü içinde WebClient.DownloadString arayarak indirmek için bir BackgroundWorker kullanıyordum. Kullanıcının, indirme öğelerinin ortasında iptal etmesini istedim, böylece 'un döngünün ortasında olduğunu bulduğumda CancelAsync'u aradım.Bir BackgroundWorker'ı nasıl duraklatabilirim? Veya benzer bir

Ama şimdi fonksiyon DownloadString tür bazen donuyor fark, bu yüzden (BackgroundWorker ile oluşturulan diğer iş parçacığı içindeki tüm bu) yerine DownloadStringAsync kullanmaya karar verdi. Döngü ve işlevden çıktıktan sonra tüm kodumu yeniden yazmak istemediğimden, DownloadStringAsync numaralı telefonu çağırdıktan sonra, bir şey yaptıktan sonra bir süre döngü yaptıktan sonra hiçbir şey yapmadım ancak bool Stop değişkenini kontrol ettiğimde DownloadStringCompleted olay işleyicisi çağrılır veya kullanıcı işlemi iptal etmek istediğinde.

Şimdi, garip olan şey, hata ayıklama sürümünde iyi çalışmasıdır; ancak bir sürümde, program, ana iş parçacığı gibi, zaman döngüsünde donuyor.

cevap

4

Sesler bir süre döngüde meşgulken bekliyorsunuz. Örneğin, olay sinyalini kullanmalısınız. Bir WaitHandle. Serbest bırakma modunda meşgul bekleyen bir döngü, tüm cpu'nuzu çok iyi tüketebilir ve bir donma hissi verebilir.

WaitHandle'ı DownloadString'de işaretleyin veya kullanıcı indirmeyi iptal ederse.

WaitHandle sınıfındaki MSDN docs denetleyin. Orada da bir örnek var. bunu bastığınızda, pauseWorker (Global değişken veya özellik) gerçek olur ve döngüler olduğunu

int icounter = 1; 
while (icounter < SomeListInventory.Count) 
      { 
       while (pauseWorker == false) 
       { 
        //----------------------- 
        //DO SOME WORK 
         icounter++; 
        //----------------------- 
       } 
      } 

Ve, bir düğme duraklama varken

+0

WaitHandle sadece mükemmel çalışıyor. Teşekkür ederim! – Juan

+0

Arka plan işçisinde http://stackoverflow.com/questions/8359058/pause-resume-loop-in-background-worker adresindeki Duraklat/Devam döngüsü –

0

İptal etme süresini kontrol eden while döngüsünü kısa bir süre (bazı ms) uyku moduna geçirin. Bu, diğer iş parçacıkları ve işlemler için CPU çalışma zamanını serbest bırakır.

+1

Meşgul beklemek kötü bir uygulamadır. –

+0

Biliyorum ve ben C# /. Net (her zaman yeni şeyler öğrenmek için :-)) bir WaitHandle gibi bir şey olduğunu bilmiyordum, ama bazen yoklama tek çözümdür ve sonra sadece süreç sorgulama sadece emin olmalısınız Bir kez denetler ve sonra işletim sistemi tarafından iş parçacığı/işlemine verilen CPU süresini (Linux'taki verim() işlevi) verir. – Mark

+0

WaitHandles aynı zamanda bir zaman aşımı ile de kullanılabilir, bu sayede yoklamayı engeller :) (Ve daha fazla bilgi sahibi olana kadar meşgul beklediğimden payımı kullandım .. hehe) –

0

güzel konu, benim arka plan işçi sürecinde çifte kullanılan ikinciyi artırmadan sadece ilk defa, ve pauseworker = false'i tekrar yaptığımda süreç devam ediyor

İlgili konular