以下のようなタイムアウトのシンプルな非同期書き込みをコーディングし、非常に大きなバッファと小さなwaitTimeを指定すると、関数がTaskCanceledExceptionをスローすると考えます。しかし、これは起こりません。 WriteAsyncは、書き込みが完了するまで数秒間ブロックします。私は何が欠けていますか? GUIスレッドからタイムアウトのある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;
}
コール:
try
{
WriteWithTimeout(response.OutputStream, buf100M, w1ms);
}
catch(OperationCanceledException e)
{
ConsoleWriteLine("Failed with exception: {0}", e.Message);
}
あなたは 'tokenSource.CancelAfter(のTimeSpanを行うべきではありませんコンストラクタに
FileOptions.Asynchronous
に合格しない場合FileStream
のデフォルトの動作です。たとえば。 FromMilliseconds(waitMs)); 'AFTER' WriteAsync'そしてそれを待っていますか?例えばこの回答はここにあります:https://stackoverflow.com/questions/23476576/cancellationtoken-timeout-vs-task-delay-and-timeout – zaitsman私は夢中ですか、これは私がする必要があるのですか: Task task = response.OutputStream .WriteAsync(buf、0、buf.Length); if(task.Wait(maxWait)) { // OK。 } else { //タイムアウトしました。 } –