接受Func <T>的简单超时方法未在等待

The*_*l26 0 c# asynchronous async-await

我正在尝试创建一个简单的可重用的超时方法,该方法是完全异步的。由于某种原因,我的超时方法没有被等待,我为之感到困惑。

    [Fact]
    public async void TestTimeOut()
    {
        Stopwatch sw = Stopwatch.StartNew();
        var Thrown = false;
        try
        {
            await TimeOut(() => Task.Delay(5000), TimeSpan.FromMilliseconds(1000));
        }
        catch(OperationCanceledException ex)
        {
            //** Never Hit
            Thrown = true;
        }
        sw.Stop();

        Assert.True(sw.Elapsed >= TimeSpan.FromMilliseconds(1000)); //** fails nothing is awaited, executes in less than 40ms

        Assert.True(Thrown); //** Fails
    }

    private async Task<T> TimeOut<T>(Func<T> method, TimeSpan timeOut)
    {
        using (var ctsForTask = new CancellationTokenSource())
        {
            var taskTimeOut = Task.Delay(timeOut);
            Task<T> task = Task.Run(() => method(), ctsForTask.Token);
            if (task != await Task.WhenAny(task, taskTimeOut))
            {
                ctsForTask.Cancel();
                throw new OperationCanceledException(ctsForTask.Token);
            }
            return task.Result;
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

Timeout正在等待,但() => Task.Delay(5000)lambda不是。由于Task.Run不知道这T是一个Task,因此它立即返回。使用Func<Task<T>>Func<Task>代替。