SORU
11 EYLÜL 2008, PERŞEMBE


Nasıl Konsol için bir zaman Aşımı eklemek için.() Atayarak?

Kullanıcı vermek istiyorum app konsol varxistemine yanıt vermesi saniye. Eğer herhangi bir giriş belirli bir süre sonra yapılırsa, program mantığı devam etmelidir. Bir zaman aşımı boş bir yanıt anlamına gelir varsayalım.

Bu yaklaşmanın en kolay yolu nedir?

CEVAP
20 AĞUSTOS 2013, Salı


5 yıl sonra, tüm cevapları hala aşağıdaki sorunlardan bir veya daha fazla muzdarip olduğunu öğrenince şaşırdım:

  • Bir fonksiyon Atayarak dışında kullanılan, işlev kaybına neden oluyor. (Anahtar önceki giriş için Sil/Geri Al/).
  • Fonksiyon birden fazla kere çağrıldığında kötü (birden çok iş parçacığı, çok asılı Seçeneği var, ya da aksi halde beklenmeyen bir davranış yumurtlama) davranır.
  • İşlevi, bir şeylerle meşgul bekle dayanır. Beklemek her yerde birden çok dakika olabilir zaman aşımı süresi kadar saniye, çok sayıda aday olması bekleniyor beri korkunç bir israf. Zaman böyle bir miktar için çalışan meşgul-bekle bir çoklu bir senaryoda özellikle kötü olan kaynaklar, korkunç bir kaybıdır. Eğer meşgul-bekle bir uyku ile değiştirilirse bu muhtemelen çok büyük bir sorun olmadığını kabul ediyorum ama yanıt üzerinde olumsuz bir etkisi vardır.

Benim çözüm yukarıdaki sorunlardan herhangi muzdarip olmadan orijinal sorunu çözeceğine inanıyorum

class Reader {
  private static Thread inputThread;
  private static AutoResetEvent getInput, gotInput;
  private static string input;

  static Reader() {
    getInput = new AutoResetEvent(false);
    gotInput = new AutoResetEvent(false);
    inputThread = new Thread(reader);
    inputThread.IsBackground = true;
    inputThread.Start();
  }

  private static void reader() {
    while (true) {
      getInput.WaitOne();
      input = Console.ReadLine();
      gotInput.Set();
    }
  }

  public static string ReadLine(int timeOutMillisecs) {
    getInput.Set();
    bool success = gotInput.WaitOne(timeOutMillisecs);
    if (success)
      return input;
    else
      throw new TimeoutException("User did not provide input within the timelimit.");
  }
}

Arama, tabii, çok kolay

try {
  Console.WriteLine("Please enter your name within the next 5 seconds.");
  string name = Reader.ReadLine(5000);
} catch (TimeoutException) {
  Console.WriteLine("Sorry, you waited too long.");
} 

Peki bahsettiğim diğer çözümler bu sorunları?

  • Gördüğünüz gibi, kullanılan Atayarak, ilk sorun kaçınarak.
  • Bu fonksiyon birden fazla kere çağrıldığında düzgün davranır. Bir zaman aşımı oluşur olsun ya da olmasın, hiç iş parçacığı çalışan ve sadece en fazla bir arama Seçeneği için sadece bir arka plan daha etkin olacaktır. İşlevi çağıran her zaman bir zaman aşımı en son girişi veya sonucu, ve kullanıcı adınızı girin, bir kez daha onun giriş göndermek için vurmak zorunda kalmayacak.
  • Ve, açıkçası, bir işlev meşgul-bir dakika dayanmaz. Yerine uygun çoklu teknikleri israfı önlemek için kullanır.

Bu çözüm ile görebildiğim tek sorun güvenli iş parçacığı değildir. Ancak, birden çok iş parçacığı aynı anda giriş için Kullanıcı soramaz, eşitleme Reader.ReadLine bir arama yapmadan önce yine başıma geliyor.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Amazon Web Services

    Amazon Web S

    8 NİSAN 2009
  • LAHWF

    LAHWF

    5 Kasım 2009
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008