問題タブ [system.threading.channels]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - ChannelReader.ReadAsync(CancellationToken) と ChannelWriter.WriteAsync(CancellationToken) は、トークンが通知されたときに返されないかスローされません
編集:説明をクリーンアップしています。これは...WriteAsync
だけでなく、これも影響を与えると判断したためです。ReadAsync
これらの呼び出しの 1 つが現在ブロックReadAsync
されている場合 (チャネルが空であるかWriteAsync
、チャネルがいっぱいであるために)、キャンセル トークンを通知しても呼び出し元に実行が返されることはありません。つまり、値を返さず、スローもしません。永遠にブロックするだけです。Complete
別のスレッドからチャネルを呼び出すと、ブロックされた呼び出しが throwChannelClosedException
になりますが、通知されたキャンセル トークンが十分でない理由は明確ではありません。
さらに混乱を招くことに、コードは実際には .NET Fiddle として期待どおりに機能しますが、Visual Studio 2019 内またはコマンド プロンプト (両方とも Windows 10 x64) からは機能しません。
以下のサンプル コードではComplete
、main の行のコメントを解除すると、クリーン シャットダウンが可能になりますが、そうしないと、呼び出しがWriteAsync
返されないため、呼び出しがTask.WaitAll
返されません。
そして出力: