Utc

Timeout czyli kolejny plus dla DateTime.UtcNow

Posted on Updated on

Taki “synchronizator”, który dodatkowo przerwie czekanie po kilku sekundach.

private static void WaitWithTimeout()
{
    var startTime = DateTime.Now;

    while (true)
    {
        lock (SyncRoot)
        {
            if (!_isOperationInProgress)
            {
                return;
            }
        }

        if (DateTime.Now - startTime > TimeSpan.FromSeconds(3))
        {
            throw new TimeoutException("Max duration exceeded");
        }

        Debug.WriteLine("Waiting for xxx with timeout...");
        Task.Delay(TimeSpan.FromMilliseconds(50)).Wait();
    }
}

Użycie DateTime.Now sprawia, że ten kod wywali się na pewno raz w roku podczas zmiany czasu na letni/zimowy czy tam na odwrót. Oczywiście optymiści powiedzą że na pewno nam się to nie przytrafi bo prawdopodobieństwo małe… Ach Ci optymiści 😀 A potem grzebiesz w gównie (najczęściej nie swoim) bo nie możesz zreprodukować.

DateTime.UtcNow zrobi robotę.

private static void WaitWithTimeout()
{
    var startTime = DateTime.UtcNow;

    while (true)
    {
        lock (SyncRoot)
        {
            if (!_isOperationInProgress)
            {
                return;
            }
        }

        if (DateTime.UtcNow - startTime > TimeSpan.FromSeconds(3))
        {
            throw new TimeoutException("Max duration exceeded");
        }

        Debug.WriteLine("Waiting for xxx with timeout...");
        Task.Delay(TimeSpan.FromMilliseconds(50)).Wait();
    }
}
Advertisements