在C#.NET 4.0中为异步调用指定CancellationTokenSource超时

时间:2015-05-18 16:38:15

标签: c# .net .net-4.0

我正在尝试使用固定超时从Azure下载blob。我在.NET 4.5中有以下工作代码。但是,当我尝试在.NET 4.0中重写时,我找不到一种方法来指定CancellationTokenSource的超时。你能帮忙吗?

var cts = new CancellationTokenSource((int)TimeSpan.FromSeconds(30).TotalMilliseconds);

using (var memoryStream = new System.IO.MemoryStream())
{
    Task task = blockBlob.DownloadToStreamAsync(memoryStream, cts.Token);
    await task.ConfigureAwait(false);

    ...
}

此外,如果在指定时间内未下载blob,我发现以下代码(在4.0中)超时。我不确定在使用它时是否应该小心。

Task task = blockBlob.DownloadToStreamAsync(memoryStream);
task.Wait((int)TimeSpan.FromSeconds(30).TotalMilliseconds);

1 个答案:

答案 0 :(得分:1)

AFAIK无法在4.5框架之前指定CancellationTokenSource超时。我建议你使用下一个方法

var cts = new CancellationTokenSource();
var timer = new System.Timers.Timer(timeout) {AutoReset = false};
timer.Elapsed += (sender, eventArgs) => { cts.Cancel(); };
var task = new Task(action, cts.Token);
task.Start();
timer.Start();

笨拙,但正在工作