問題タブ [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.

0 投票する
1 に答える
69 参照

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返されません。

そして出力: