【发布时间】:2017-12-13 01:23:58
【问题描述】:
我尝试编写一个带有超时的简单异步写入,如下所示,并期望函数在给定非常大的缓冲区和小的等待时间的情况下抛出 TaskCanceledException。但是,这不会发生。 WriteAsync 将阻塞数秒,直到写入完成。我错过了什么?
public async void WriteWithTimeout(Stream os, byte[] buf, int waitMs)
{
CancellationTokenSource tokenSource = new CancellationTokenSource(waitMs); // cancel after waitMs milliseconds.
await os.WriteAsync(buf, 0, buf.Length, tokenSource.Token);
return;
}
从 GUI 线程调用:
try
{
WriteWithTimeout(response.OutputStream, buf100M, w1ms);
}
catch(OperationCanceledException e)
{
ConsoleWriteLine("Failed with exception: {0}", e.Message);
}
【问题讨论】:
-
您不应该在
WriteAsync之后执行tokenSource.CancelAfter(TimeSpan.FromMilliseconds(waitMs));然后等待吗?例如这个答案在这里:stackoverflow.com/questions/23476576/… -
我是疯了还是这就是我需要做的一切:Task task = response.OutputStream.WriteAsync(buf, 0, buf.Length); if(task.Wait(maxWait)) { // 好的。 } else { // 超时。 }
标签: c# async-await outputstream cancellationtokensource