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

  • guillaume2111's channel

    guillaume211

    19 Kasım 2006
  • jesiel santos

    jesiel santo

    15 Ocak 2009
  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007