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

質問編集履歴

3

Scan+Concatで無限には続かった

2021/05/25 04:19

投稿

soi013
soi013

スコア149

title CHANGED
File without changes
body CHANGED
@@ -52,36 +52,38 @@
52
52
  #### Scan+Concatの場合
53
53
 
54
54
  変換メソッドを`Scan+Concat`で呼んだ場合、変換メソッド`ConvertAsync`の順番は保たれますが、
55
- 変換部分停止はできません。出力部分だけ停止されます。
55
+ 変換部分がすぐ停止ません。出力部分だけがすぐ停止されます。
56
56
 
57
- 以下では停止処理`disposerA.Dispose()`無限に変換は続きます。
57
+ 以下では5個目完了ぐらいのタイミングで停止処理`disposerA.Dispose()`して、12個目まで変換は続きます。
58
+ 大体止めた個数の倍ぐらいまで変換が続くようです。20個目で停止→40個目ぐらいまで変換される。
58
59
 
59
60
  出力結果
60
61
  ```
61
- 00.096|Thread:1|Start Subscription
62
+ 00.065|Thread:1|Start Subscription
62
- 00.649|Thread:5|Start ConvertAsync 0
63
+ 00.613|Thread:4|Start ConvertAsync 0
63
- 00.782|Thread:5|End ConvertAsync 0
64
+ 00.745|Thread:4|End ConvertAsync 0
64
- 00.787|Thread:4|Subscrive inputValue:[Converted:0 delayMilliSec:100]
65
+ 00.751|Thread:5|Subscrive inputValue:[Converted:0 delayMilliSec:100]
65
- 01.140|Thread:4|Start ConvertAsync 1
66
+ 01.121|Thread:5|Start ConvertAsync 1
66
- 01.250|Thread:4|End ConvertAsync 1
67
+ 01.233|Thread:5|End ConvertAsync 1
67
- 01.250|Thread:4|Subscrive inputValue:[Converted:1 delayMilliSec:100]
68
+ 01.233|Thread:5|Subscrive inputValue:[Converted:1 delayMilliSec:100]
68
- 01.635|Thread:4|Start ConvertAsync 2
69
+ 01.614|Thread:6|Start ConvertAsync 2
69
- 01.756|Thread:7|End ConvertAsync 2
70
+ 01.725|Thread:4|End ConvertAsync 2
70
- 01.756|Thread:5|Subscrive inputValue:[Converted:2 delayMilliSec:100]
71
+ 01.725|Thread:4|Subscrive inputValue:[Converted:2 delayMilliSec:100]
71
- 02.145|Thread:5|Start ConvertAsync 3
72
+ 02.112|Thread:4|Start ConvertAsync 3
72
- 03.690|Thread:6|End ConvertAsync 3
73
+ 03.978|Thread:6|End ConvertAsync 3
73
- 03.690|Thread:6|Start ConvertAsync 4
74
+ 03.979|Thread:6|Start ConvertAsync 4
74
- 03.690|Thread:4|Subscrive inputValue:[Converted:3 delayMilliSec:1530]
75
+ 03.979|Thread:5|Subscrive inputValue:[Converted:3 delayMilliSec:1858]
75
- 04.650|Thread:5|End ConvertAsync 4
76
+ 05.823|Thread:7|End ConvertAsync 4
76
- 04.650|Thread:5|Start ConvertAsync 5
77
+ 05.823|Thread:7|Start ConvertAsync 5
77
- 04.651|Thread:4|Subscrive inputValue:[Converted:4 delayMilliSec:956]
78
+ 05.823|Thread:6|Subscrive inputValue:[Converted:4 delayMilliSec:1836]
78
79
 
79
- 06.158|Thread:1|Dispose Subscription
80
+ 06.920|Thread:1|Dispose Subscription
80
- 06.296|Thread:4|End ConvertAsync 5
81
+ 07.223|Thread:4|End ConvertAsync 5
81
- 06.296|Thread:4|Start ConvertAsync 6
82
+ 07.223|Thread:4|Start ConvertAsync 6
82
- 07.997|Thread:6|End ConvertAsync 6
83
+ 08.545|Thread:6|End ConvertAsync 6
84
+ (略)
83
- 07.998|Thread:6|Start ConvertAsync 7
85
+ 15.244|Thread:4|Start ConvertAsync 12
84
- ...(終わらない)
86
+ 16.961|Thread:6|End ConvertAsync 12
85
87
  ```
86
88
 
87
89
  ### 該当のソースコード

2

誤字

2021/05/25 04:18

投稿

soi013
soi013

スコア149

title CHANGED
File without changes
body CHANGED
@@ -11,7 +11,7 @@
11
11
  ### 発生している問題・エラーメッセージ
12
12
  #### SelectManyの場合
13
13
 
14
- 変換メソッドを`SelectMany`でんだ場合、変換メソッド`ConvertAsync`の順番が前後してしまっています。
14
+ 変換メソッドを`SelectMany`でんだ場合、変換メソッド`ConvertAsync`の順番が前後してしまいます。
15
15
  ただし、変換→出力部分の停止はできています。
16
16
 
17
17
  以下では0~3個目までは問題ないですが、3個目の開始`Start ConvertAsync 3`の後に、3個目の完了`End ConvertAsync 3`前に4個目が開始`Start ConvertAsync 4`してしまいます。
@@ -51,7 +51,7 @@
51
51
 
52
52
  #### Scan+Concatの場合
53
53
 
54
- 変換メソッドを`Scan+Concat`でんだ場合、変換メソッド`ConvertAsync`の順番は保たれますが、
54
+ 変換メソッドを`Scan+Concat`でんだ場合、変換メソッド`ConvertAsync`の順番は保たれますが、
55
55
  変換部分の停止はできません。出力部分だけ停止されます。
56
56
 
57
57
  以下では停止処理`disposerA.Dispose()`後も無限に変換は続きます。

1

補足

2021/05/25 04:08

投稿

soi013
soi013

スコア149

title CHANGED
@@ -1,1 +1,1 @@
1
- Reactive Extensionsでasyncメソッドを順番に実行したい
1
+ [C#]Reactive Extensionsでasyncメソッドを順番に実行したい
body CHANGED
@@ -6,6 +6,7 @@
6
6
  ここではサンプルとして、1秒毎に値を発行する`Observable.Interval`を入力、文字列への変換をするメソッド`ConvertAsync`を変換、時刻などを付加してコンソールへプリントするメソッド`WriteLineDebug`を出力としています。
7
7
 
8
8
  変換メソッド`ConvertAsync`は内部で`await Task.Delay`をしていますが、実際に使用する場合はここがファイルやネットワークアクセスになります。
9
+ この`ConvertAsync`の開始・終了が前後しないように順番に行いたいです。
9
10
 
10
11
  ### 発生している問題・エラーメッセージ
11
12
  #### SelectManyの場合
@@ -53,7 +54,7 @@
53
54
  変換メソッドを`Scan+Concat`で読んだ場合、変換メソッド`ConvertAsync`の順番は保たれますが、
54
55
  変換部分の停止はできません。出力部分だけ停止されます。
55
56
 
56
- 停止処理`disposerA.Dispose()`後も無限に変換は続きます。
57
+ 以下では停止処理`disposerA.Dispose()`後も無限に変換は続きます。
57
58
 
58
59
  出力結果
59
60
  ```
@@ -151,6 +152,7 @@
151
152
  [Reactive Extensions再入門](https://blog.okazuki.jp/entry/20120324/1330956809)
152
153
 
153
154
  ### 補足情報(FW/ツールのバージョンなど)
154
-
155
+ C# 8.0
155
156
  .NET 5.0
156
- "System.Reactive" Version="5.0.0"
157
+ "System.Reactive" Version="5.0.0"
158
+ VisualStudio 2019