質問編集履歴

3

CancellationTokenの実践結果を記述

2020/06/06 14:23

投稿

appdev
appdev

スコア16

test CHANGED
File without changes
test CHANGED
@@ -75,3 +75,45 @@
75
75
  レスポンスのメッセージだけでなく付随する情報があるかと思います。
76
76
 
77
77
  それらのフレームの規格が全くない状態のため、メッセージを返却し終わったかどうかのルール作れないです。
78
+
79
+
80
+
81
+
82
+
83
+ CancellationTokenパターンで以下の様に試してみた。
84
+
85
+ このパターンだと、フリーズ発生前にcts.Cancel()を呼び出すとExceptionを発生させてくれて動作を止めることを確認しました。
86
+
87
+ しかし、上記のメッセージを返却し終わった後に、cts.Cancel()を呼び出してもExceptionは発生せず、
88
+
89
+ レスポンスを受け取ろうとするとそこで止まってしまいます。
90
+
91
+
92
+
93
+ トークンソースの作成
94
+
95
+ ```
96
+
97
+ CancellationTokenSource cts = new CancellationTokenSource();
98
+
99
+ ```
100
+
101
+
102
+
103
+ Task内でReadAsyncにセット
104
+
105
+ ```
106
+
107
+ var result = await stream.ReadAsync(buffer, 0, buffer.Length, cts.Token);
108
+
109
+ ```
110
+
111
+
112
+
113
+ キャンセル呼び出し
114
+
115
+ ```
116
+
117
+ cts.Cancel();
118
+
119
+ ```

2

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

2020/06/06 14:23

投稿

appdev
appdev

スコア16

test CHANGED
File without changes
test CHANGED
@@ -41,3 +41,37 @@
41
41
  .NET CoreでもThread.Abort()を呼び出す方法があるのでしょうか?
42
42
 
43
43
  他にも回避策があれば、教えていただきたいです。
44
+
45
+
46
+
47
+
48
+
49
+ -----------------------------------------------------------------------------------------
50
+
51
+ 2020/06/06追記
52
+
53
+ 説明が不足しており申し訳ございません。
54
+
55
+
56
+
57
+ >想定されるパターンが多すぎて
58
+
59
+ 想定されるパターンは、入力に対するレスポンスのパターンです。
60
+
61
+ イメージとしてはTeratermでssh接続し、Linux側のアプリケーションを起動すると指定の行・列情報や文字色などのルールをバイト単位で返却して画面描画を行っています。
62
+
63
+ 利用者は、全てキーボードでメニュー選択などを行い対話することが可能です。
64
+
65
+ このアプリケーションの問題点は、レスポンスが終わったときにレスポンス完了した旨がわかるバイトコードを返さないという点です。
66
+
67
+
68
+
69
+ ssh接続を行いlsコマンドを受け取ったりする際においては、読取処理でフリーズすることはないかと思います。
70
+
71
+ 上記のアプリでは、最後のバイトコードが普通に画面表示を行うための文字を返している可能性もあり得ます。
72
+
73
+ 例えば、http/2のプロトコルにおいて、レスポンスを返す際は、レスポンス単位にフレームがついて返却されるため、
74
+
75
+ レスポンスのメッセージだけでなく付随する情報があるかと思います。
76
+
77
+ それらのフレームの規格が全くない状態のため、メッセージを返却し終わったかどうかのルール作れないです。

1

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

2020/06/06 12:23

投稿

appdev
appdev

スコア16

test CHANGED
File without changes
test CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
 
4
4
 
5
- 現在、開発中のシステムでは、C#でからsshでLinux接続して、
5
+ 現在、開発中のシステムでは、C#でからsshでLinux接続して、
6
6
 
7
7
  過去に開発された、コンソール画面でGUIっぽく見せたシステムを操作させています。
8
8
 
9
9
  通常のsshのレスポンスと異なる点は、
10
10
 
11
- System.IO.Stream.ReadByte()でレスポンスを受け取る際に既にすべて返却していると、
11
+ System.IO.Stream.ReadByte()でレスポンスを受け取る際に既にすべて受信していると、
12
12
 
13
13
  C#側ではレスポンス待ちのままフリーズしてしまいます。
14
14