en attente de tâche avec un délai d'attente

Je suis en train d'écrire une méthode d'aide qui me permet de passer en un point arbitraire de la tâche et un délai d'attente. Si la tâche est terminée avant que le délai, un succès délégué est appelé, sinon une erreur délégué est appelé. La méthode ressemble à ceci:

    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();
            }
        }
    }

Maintenant ce semble de travail la plupart du temps, mais je voulais écrire quelques tests pour vous en assurer. Ce test, à ma grande surprise, échoue, et appelle l'erreur délégué au lieu de la réussite:

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

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

        Assert.IsTrue(successCalled);

Ce test, cependant, est vert:

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

        var successCalled = false;

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

        Assert.IsTrue(successCalled);

Comment dois-je faire à la fois des tests de vert? Mon utilisation de la Tâche.WhenAny incorrect?

Delay(1) est très court (surtout si vous êtes de débogage) - départ sur thread séparé de la rendre suffisamment long pour votre test à passer la plupart du temps. Essayez d'utiliser plus de retard ou, mieux encore, tâche qui permet de remplir à la main synchrone, il en test.

OriginalL'auteur user1202032 | 2016-02-26