SORU
18 Kasım 2008, Salı


C Uygulamak# Genel Zaman Aşımı

Tek bir satır (veya anonim temsilci) kod zaman aşımı ile yürütmek için genel bir şekilde uygulanması için iyi fikirler arıyorum.

TemperamentalClass tc = new TemperamentalClass();
tc.DoSomething();  // normally runs in 30 sec.  Want to error at 1 min

Zarif bir şekilde benim kod kaprisli kodu değiştiremem) ile etkileşime pek çok alanda uygulanabilir bir çözüm arıyorum.

Buna ek olarak, soruna neden olan "zaman aşımına uğradı" code mümkünse. daha yürütme durduruldu istiyorum

CEVAP
18 Kasım 2008, Salı


Gerçekten zor kısım burada iptal olabilir yere Eylemi geri vasi iplik geçip uzun süren görevi öldürmekti. Lambda oluşturulan bu yöntemi yerel bir değişken öldürmek iplik geçer sarılmış bir temsilci ile bunu başardım.

Ben bu örnek, zevk için gönderin. Gerçekten ilgilendiğiniz yöntemi CallWithTimeout.Bu iptal ve ThreadAbortException yutma ile uzun süren bir iş parçacığı iptal edecektir:

Kullanımı:

class Program
{

    static void Main(string[] args)
    {
        //try the five second method with a 6 second timeout
        CallWithTimeout(FiveSecondMethod, 6000);

        //try the five second method with a 4 second timeout
        //this will throw a timeout exception
        CallWithTimeout(FiveSecondMethod, 4000);
    }

    static void FiveSecondMethod()
    {
        Thread.Sleep(5000);
    }

Statik yöntem işi:

    static void CallWithTimeout(Action action, int timeoutMilliseconds)
    {
        Thread threadToKill = null;
        Action wrappedAction = () =>
        {
            threadToKill = Thread.CurrentThread;
            action();
        };

        IAsyncResult result = wrappedAction.BeginInvoke(null, null);
        if (result.AsyncWaitHandle.WaitOne(timeoutMilliseconds))
        {
            wrappedAction.EndInvoke(result);
        }
        else
        {
            threadToKill.Abort();
            throw new TimeoutException();
        }
    }

}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • adrianisen

    adrianisen

    25 Kasım 2009
  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • newport83

    newport83

    19 HAZİRAN 2006

İLGİLİ SORU / CEVAPLAR