Mam serię bloków kodu, które trwają zbyt długo. Nie potrzebuję żadnej finezji, gdy się nie uda. W rzeczywistości chcę rzucić wyjątek, gdy te bloki trwają zbyt długo i po prostu wypadają z naszej standardowej obsługi błędów. Wolałbym NIE tworzyć metod z każdego bloku (które są jedynymi sugestiami, które widziałem do tej pory), ponieważ wymagałoby to poważnej przeróbki podstawy kodu.Jak utworzyć ogólny obiekt limitu czasu dla różnych bloków kodu?
Oto, co chciałbym JAK utworzyć, jeśli to możliwe.
public void MyMethod(...)
{
...
using (MyTimeoutObject mto = new MyTimeoutObject(new TimeSpan(0,0,30)))
{
// Everything in here must complete within the timespan
// or mto will throw an exception. When the using block
// disposes of mto, then the timer is disabled and
// disaster is averted.
}
...
}
Stworzyłem prosty obiekt do tego przy użyciu klasy Timer. (UWAGA dla tych, którzy lubią kopiuj/wklej ten kod: NIE DZIAŁA !! NIE)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
public class MyTimeoutObject : IDisposable
{
private Timer timer = null;
public MyTimeoutObject (TimeSpan ts)
{
timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Interval = ts.TotalMilliseconds;
timer.Start();
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
throw new TimeoutException("A code block has timed out.");
}
public void Dispose()
{
if (timer != null)
{
timer.Stop();
}
}
}
To nie działa ponieważ wychwytuje klasy System.Timers.Timer, absorbuje i ignoruje wszelkie wyjątki generowane wewnątrz, który - jak już odkryłem - pokonuje mój projekt. Każdy inny sposób tworzenia tej klasy/funkcjonalności bez całkowitego przeprojektowania?
Wydaje się to takie proste dwie godziny temu, ale powoduje wiele bólu głowy.
Czy zajmujesz się wyjątkami na wyższym poziomie, skąd wywołujesz tę metodę? Co więcej, czy jest to środowisko wielowątkowe? – Shaharyar
Możesz użyć statycznego magazynu 'CancellationToken' i używać go wszędzie tam, gdzie masz zadanie, lub - mniej elegancko, ale może bardziej efektywnie - masz inny proces, który może zabić twój główny proces i jest wywoływany przez lokalny HTTP lub potoki nazwane –
Shaharyar: Tak. Połów jest daleko w górę łańcucha. I tak, jest to środowisko wielowątkowe. Biblioteka, którą piszę, ma być używana w aplikacjach WinForm, a nie w sieci. – Jerry