SORU
24 Aralık 2008, ÇARŞAMBA


İplik kullanarak karşılaştırın.Gecikmeli çalıştırma için uyku ve Zamanlayıcı

Zaman belirli bir süre için çalışan gecikmiş olması gereken bir yöntem var.

Kullanmalıyım

Thread thread = new Thread(() => {
    Thread.Sleep(millisecond);
    action();
});
thread.IsBackground = true;
thread.Start();

Ya

Timer timer = new Timer(o => action(), null, millisecond, -1);

İplik kullanımı hakkında articles bazı okumuştum.Uyku kötü bir tasarım. Ama gerçekten anlamıyorum.

Ama Zamanlayıcı kullanarak, Zamanlayıcı atma yöntemi vardır. Yürütme gecikmeli olduğundan, Zamanlayıcı nasıl kurtulacağım bilmiyorum. Herhangi bir öneriniz var mı?

Ya eğer gecikmeli çalıştırma için alternatif kodları varsa da takdir ediyorum.

Teşekkür ederim

CEVAP
24 Aralık 2008, ÇARŞAMBA


Tek fark bu Sistem.İş parçacığı.Zamanlayıcı iş parçacığı havuzu iş parçacığı üzerinde geri, yeni bir iş parçacığı her zaman oluşturmak yerine gönderir. Eğer bu başına fazla bir kez sırasında yaşam uygulaması, bu kurtaracak yükü yaratma ve yok etme bir sürü iş parçacığı (bir süreç olan çok yoğun kaynak, makale referans noktaları), o zaman sadece yeniden iş parçacığı havuzu, ve eğer sen-ecek var birden fazla zamanlayıcı anda yapmaya anlamı olur mu daha az iş parçacığı çalışan bir defada (aynı zamanda tasarruf önemli kaynaklar).

Diğer bir deyişle, Zamanlayıcı çok daha verimli olacak. Ayrıca, daha doğru, İplik yana olabilir.Uyku sadece en AZINDAN uzun süre olarak belirttiğiniz (işletim sistemi çok daha uzun süre uyutmak olabilir) beklemek garantilidir. Kabul ediyorum, Zamanlayıcı hala tam olarak doğru değil, ama niyet bu mutlaka İplik niyet DEĞİL ise geri mümkün olduğu belirtilen süre için en yakın yangın.Uyku.

Olarak yok etmek için Zamanlayıcı, geri kabul edilebilir bir parametre, yani sen-ebilmek muktedir geçiş Zamanlayıcı kendisi gibi parametre ve çağrı Atma geri (gerçi denemedim bu sanırım mümkün olduğunu Zamanlayıcı olabilir kilitli sırasında geri arama).

Edit: Hayır, Zamanlayıcı yapıcı geri arama parametresi kendisi belirtmelisiniz beri bu işi yapamazsın sanırım.

Böyle bir şey olabilir mi? (Yine, aslında hiç denemedim)

class TimerState
{
    public Timer Timer;
}

...ve sayacı başlatmak için:

TimerState state = new TimerState();

lock (state)
{
    state.Timer = new Timer((callbackState) => {
        action();
        lock (callbackState) { callbackState.Timer.Dispose(); }
        }, state, millisecond, -1);
}

Kilitleme çekim alanı olması için önce zamanlayıcı çalışırken zamanlayıcı geri önlemek.

< / ^ hr .

Ek: yorumcu eylem olmadığını belirttiği, () UI, sonra bir Sistem kullanarak yapar.Windows.Formlar.Zamanlayıcı UI iş parçacığı üzerinde geri çalışır olasılıkla daha iyi bir bahistir. Eğer bu durumda değil, ancak ve İplik.Diş çekme vs uyku.Zamanlayıcı İş Parçacığı.Zamanlayıcı gitmek yoludur.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Doc Adams

    Doc Adams

    20 HAZİRAN 2007
  • ELawshea

    ELawshea

    26 Mayıs 2008
  • Kassem G

    Kassem G

    25 EKİM 2006