teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

CancellationTokenの実践結果を記述

2020/06/06 14:23

投稿

appdev
appdev

スコア16

title CHANGED
File without changes
body CHANGED
@@ -36,4 +36,25 @@
36
36
  上記のアプリでは、最後のバイトコードが普通に画面表示を行うための文字を返している可能性もあり得ます。
37
37
  例えば、http/2のプロトコルにおいて、レスポンスを返す際は、レスポンス単位にフレームがついて返却されるため、
38
38
  レスポンスのメッセージだけでなく付随する情報があるかと思います。
39
- それらのフレームの規格が全くない状態のため、メッセージを返却し終わったかどうかのルール作れないです。
39
+ それらのフレームの規格が全くない状態のため、メッセージを返却し終わったかどうかのルール作れないです。
40
+
41
+
42
+ CancellationTokenパターンで以下の様に試してみた。
43
+ このパターンだと、フリーズ発生前にcts.Cancel()を呼び出すとExceptionを発生させてくれて動作を止めることを確認しました。
44
+ しかし、上記のメッセージを返却し終わった後に、cts.Cancel()を呼び出してもExceptionは発生せず、
45
+ レスポンスを受け取ろうとするとそこで止まってしまいます。
46
+
47
+ トークンソースの作成
48
+ ```
49
+ CancellationTokenSource cts = new CancellationTokenSource();
50
+ ```
51
+
52
+ Task内でReadAsyncにセット
53
+ ```
54
+ var result = await stream.ReadAsync(buffer, 0, buffer.Length, cts.Token);
55
+ ```
56
+
57
+ キャンセル呼び出し
58
+ ```
59
+ cts.Cancel();
60
+ ```

2

説明が不足していましたので追記させて頂きました

2020/06/06 14:23

投稿

appdev
appdev

スコア16

title CHANGED
File without changes
body CHANGED
@@ -19,4 +19,21 @@
19
19
  処理を抜けることが出来ない状態となっております。
20
20
 
21
21
  .NET CoreでもThread.Abort()を呼び出す方法があるのでしょうか?
22
- 他にも回避策があれば、教えていただきたいです。
22
+ 他にも回避策があれば、教えていただきたいです。
23
+
24
+
25
+ -----------------------------------------------------------------------------------------
26
+ 2020/06/06追記
27
+ 説明が不足しており申し訳ございません。
28
+
29
+ >想定されるパターンが多すぎて
30
+ 想定されるパターンは、入力に対するレスポンスのパターンです。
31
+ イメージとしてはTeratermでssh接続し、Linux側のアプリケーションを起動すると指定の行・列情報や文字色などのルールをバイト単位で返却して画面描画を行っています。
32
+ 利用者は、全てキーボードでメニュー選択などを行い対話することが可能です。
33
+ このアプリケーションの問題点は、レスポンスが終わったときにレスポンス完了した旨がわかるバイトコードを返さないという点です。
34
+
35
+ ssh接続を行いlsコマンドを受け取ったりする際においては、読取処理でフリーズすることはないかと思います。
36
+ 上記のアプリでは、最後のバイトコードが普通に画面表示を行うための文字を返している可能性もあり得ます。
37
+ 例えば、http/2のプロトコルにおいて、レスポンスを返す際は、レスポンス単位にフレームがついて返却されるため、
38
+ レスポンスのメッセージだけでなく付随する情報があるかと思います。
39
+ それらのフレームの規格が全くない状態のため、メッセージを返却し終わったかどうかのルール作れないです。

1

誤字があったので修正しました

2020/06/06 12:23

投稿

appdev
appdev

スコア16

title CHANGED
File without changes
body CHANGED
@@ -1,9 +1,9 @@
1
1
  System.Threading.Thread.Abort()の処理を実装したいと考えております。
2
2
 
3
- 現在、開発中のシステムでは、C#でからsshでLinux接続して、
3
+ 現在、開発中のシステムでは、C#でからsshでLinux接続して、
4
4
  過去に開発された、コンソール画面でGUIっぽく見せたシステムを操作させています。
5
5
  通常のsshのレスポンスと異なる点は、
6
- System.IO.Stream.ReadByte()でレスポンスを受け取る際に既にすべて返却していると、
6
+ System.IO.Stream.ReadByte()でレスポンスを受け取る際に既にすべて受信していると、
7
7
  C#側ではレスポンス待ちのままフリーズしてしまいます。
8
8
  System.IO.Stream.Readでも、レスポンス以上のバイトを取得しようとすると同様にフリーズしてしまいます。
9
9
  ここの回避策としては、リクエストごとに想定されるレスポンスメッセージパターンを作成し