我正在尝试编写一个辅助方法,它允许我传入任意任务和超时时间。如果任务在超时之前完成,则调用成功委托,否则调用错误委托。该方法如下:
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();
}
}
}
现在这个似乎大部分时间都能起作用,但我也想写一些测试来确保。但这个测试让我惊讶的失败了,并调用了错误委托而不是成功委托:
var taskToAwait = Task.Delay(1);
var successCalled = false;
await TaskHelper.AwaitWithTimeout(taskToAwait, 10, () => successCalled = true, null);
Assert.IsTrue(successCalled);
然而,这个测试是绿色的:
var taskToAwait = Task.Run(async () =>
{
await Task.Delay(1);
});
var successCalled = false;
await TaskHelper.AwaitWithTimeout(taskToAwait, 10, () => successCalled = true, null);
Assert.IsTrue(successCalled);
我该如何使这两个测试都通过?我的 Task.WhenAny 用法是否不正确?