我在 LINQPad 中使用“C# 程序”选项制作了一个版本 - 它编译并运行时输出 2 行,显示超时和成功案例:
00:00:05 的超时已过期
成功得到 foo 的结果
这是片段:
void Main()
{
CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10)).Wait();
CallGetStringWithTimeout(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(0)).Wait();
}
public async Task CallGetStringWithTimeout(TimeSpan callTimeout, TimeSpan callAddedDelay)
{
var myTask = GetStringAsync(callAddedDelay);
await Task.WhenAny(Task.Delay(callTimeout), myTask);
if (myTask.Status == TaskStatus.RanToCompletion)
{
Console.WriteLine ("Successfully got result of {0}", await myTask);
}
else
{
Console.WriteLine ("Timeout of {0} expired", callTimeout);
}
}
public async Task<string> GetStringAsync(TimeSpan addedDelay)
{
await Task.Delay(addedDelay);
return "foo";
}
但是,“正常”方式是使用CancellationTokenSource并将超时指定为ctor param。如果你已经有一个 CancellationTokenSource,你可以调用它的 CancelAfter 方法,它会在指定的超时时间内安排取消。