5

私はTAP ホワイトペーパーを読んでいますが、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秒待ってください」と言っているようです。これは例のエラーですか、それとも誤解していますか?

4

1 に答える 1

3

Task.WhenAny が「ダウンロード」を返す場合、GetBitmapAsync がタイムアウトせずに返されたことを意味します。

「await download.TimeoutAfter(3000)」は、タスクから値を取得するのに時間がかかりすぎないようにします。追加の 3 秒は与えません。

最初のタスクが完了してから結果を得るまでに、どのように長い時間がかかるかを想像するのは難しいようです。

次のように置き換えることができます。

Bitmap bmp = download.Value;
于 2011-03-07T18:57:29.313 に答える