다음과 같은 간단한 예를 고려하여 NetworkStream.ReadAsync 취소 (LinqPad에 출시 할 준비를 상승 계정 필요) :이 TcpListener
void Main()
{
Go();
Thread.Sleep(100000);
}
async void Go()
{
TcpListener listener = new TcpListener(IPAddress.Any, 6666);
try
{
cts.Token.Register(() => Console.WriteLine("Token was canceled"));
listener.Start();
using(TcpClient client = await listener.AcceptTcpClientAsync()
.ConfigureAwait(false))
using(var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
var stream=client.GetStream();
var buffer=new byte[64];
try
{
var amtRead = await stream.ReadAsync(buffer,
0,
buffer.Length,
cts.Token);
Console.WriteLine("finished");
}
catch(TaskCanceledException)
{
Console.WriteLine("boom");
}
}
}
finally
{
listener.Stop();
}
}
내가 localhost:6666
에 텔넷 클라이언트를 연결하고 5 초 동안 아무것도하지 않고 앉아서하는 경우, 왜 "토큰은 취소"되었지만 결코 "붐"(또는 "완료")을 보지 못합니까?
이 NetworkStream은 취소를 고려하지 않습니까?
Task.Delay()
과 Task.WhenAny
의 조합으로이 문제를 해결할 수 있지만 예상대로 작동하도록하는 것이 좋습니다. 반대로
취소 다음의 예 :
async void Go(CancellationToken ct)
{
using(var cts=new CancellationTokenSource(TimeSpan.FromSeconds(5)))
{
try
{
await Task.Delay(TimeSpan.FromSeconds(10),cts.Token)
.ConfigureAwait(false);
}
catch(TaskCanceledException)
{
Console.WriteLine("boom");
}
}
}
인쇄 "붐"예상. 무슨 일이야?