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

我正在尝试创建一个简单的可重用超时方法,它是完全异步的。出于某种原因,我的 Timeout 方法没有被等待,我不知道为什么。


    [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;

        }

    }


智慧大石
浏览 61回答 2
2回答

斯蒂芬大帝

Timeout正在等待,但() => Task.Delay(5000)lambda 不是。因为Task.Run不知道那T是 a&nbsp;Task,所以它立即返回。使用Func<Task<T>>或Func<Task>代替。

HUX布斯

Func<Task<T>> method在 timout 方法中使用参数并等待结果
打开App,查看更多内容
随时随地看视频慕课网APP