warten Aufgaben mit Zeitlimit

Ich versuche zu schreiben, ein-Helfer-Methode, die es erlaubt mir zu übergeben, die in einer beliebigen Aufgabe und ein timeout. Wenn die Aufgabe abgeschlossen ist, bevor das Zeitlimit für einen Erfolg Delegat aufgerufen wird, andernfalls wird ein Fehler Delegat aufgerufen wird. Die Methode sieht wie folgt aus:

    public static async Task AwaitWithTimeout(Task task, int timeout, Action success, Action error)
    {
        if (await Task.WhenAny(task, Task.Delay(timeout)) == task)
        {
            if (success != null)
            {
                success();
            }
        }
        else
        {
            if (error != null)
            {
                error();
            }
        }
    }

Nun diese scheint arbeiten die meisten der Zeit, aber ich wollte Sie schreiben ein paar tests als gut zu machen wissen. Dieser test, zu meiner überraschung schlägt fehl, und ruft den Fehler zu delegieren, statt den Erfolg:

        var taskToAwait = Task.Delay(1);
        var successCalled = false;

        await TaskHelper.AwaitWithTimeout(taskToAwait, 10, () => successCalled = true, null);

        Assert.IsTrue(successCalled);

Dieser test ist allerdings grün:

        var taskToAwait = Task.Run(async () =>
        {
            await Task.Delay(1);
        });

        var successCalled = false;

        await TaskHelper.AwaitWithTimeout(taskToAwait, 10, () => successCalled = true, null);

        Assert.IsTrue(successCalled);

Wie mache ich beide tests grün? Ist meine Verwendung von Aufgabe.WhenAny falsch?

Delay(1) ist sehr kurz (vor allem, wenn Sie Debuggen) - starten Sie auf einem separaten thread machen, es ausreichend lang für Ihre Tests zu übergeben, die meisten der Zeit. Versuchen Sie, länger verzögern, oder besser noch die Aufgabe, die es erlaubt manuell komplett synchron im test.

InformationsquelleAutor user1202032 | 2016-02-26

Schreibe einen Kommentar