gpt4 book ai didi

c# - 异步 CTP - 任务超时问题

转载 作者:太空狗 更新时间:2023-10-29 23:34:44 24 4
gpt4 key购买 nike

我正在通读 TAP Whitepaper ,并且对第 22 页上为实现超时而给出的这个示例感到困惑:

“考虑一个 UI 应用程序,它想要下载图像并在下载图像时禁用 UI。但是,如果下载时间过长,则应重新启用 UI 并放弃下载。 "

public async void btnDownload_Click(object sender, EventArgs e)
{
btnDownload.Enabled = false;
try
{
Task<Bitmap> download = GetBitmapAsync(url);
if (download == await Task.WhenAny(download, Task.Delay(3000)))
{
Bitmap bmp = await download.TimeoutAfter(3000);
pictureBox.Image = bmp;
status.Text = “Downloaded”;
}
else
{
pictureBox.Image = null;
status.Text = “Timed out”;
download.ContinueWith(t => Trace(“Task finally completed”));
}
}
finally { btnDownload.Enabled = true; }
}

让我困惑的是这一行:

Bitmap bmp = await download.TimeoutAfter(3000);

此时TimeoutAfter在逻辑上的意义何在?这不应该通过调用 Task.WhenAny 来完成吗?它的意思好像是“下载任务完成后,再给它 3 秒完成”。这是示例中的错误还是我误解了它?

最佳答案

如果 Task.WhenAny 返回“下载”,则意味着 GetBitmapAsync 没有超时就返回了。

“await download.TimeoutAfter(3000)”确保从任务中获取值不会花费太长时间。它不会额外提供 3 秒。

很难想象在最初的任务完成后得到结果会花费很长时间。

可以替换为:

Bitmap bmp = download.Value;

关于c# - 异步 CTP - 任务超时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com