回答編集履歴

1

追記

2019/03/31 12:37

投稿

YAmaGNZ
YAmaGNZ

スコア10258

test CHANGED
@@ -1,4 +1,38 @@
1
+ 説明のため提示ソースを
2
+
3
+ ```C#
4
+
5
+ void Main(){
6
+
7
+ var taskScheduler = TaskScheduler.FromCurrentSynchronizationContext(); //UIスレッド
8
+
9
+ Taskの処理("xxxx").ContinueWith(t1 => {
10
+
11
+ // 成功時にここにくる。例外が発生した時はこない。t.Result にアクセスしたい
12
+
13
+ }, CancellationToken.None, TaskContinuationOptions.NotOnFaulted, taskScheduler).ContinueWith(t2 => {
14
+
15
+ // 例外が発生した時はここにくる。成功時はこない。t.Exception にアクセスしたい
16
+
17
+ }, CancellationToken.None, TaskContinuationOptions.NotOnRanToCompletion, taskScheduler);
18
+
19
+ }
20
+
21
+ ```
22
+
23
+ とします。
24
+
25
+
26
+
1
- これ、NotOnRanToCompletionが指定してある方のContinueWithって、NotOnFaultedが指定してあるContinueWithのタスクにかかってませんか?
27
+ NotOnRanToCompletionが指定してある方のContinueWith(t2のタスク)って、NotOnFaultedが指定してあるContinueWithのタスク(t1のタスク)にかかってませんか?
28
+
29
+
30
+
31
+ なので、Taskの処理内で例外が発生した場合、t1のタスクが実行されずにキャンセル扱いとなり、t2のタスクが実行されているのだと思います。
32
+
33
+ なので、t2でt.IsCanceledがtrueになると考えられます。
34
+
35
+
2
36
 
3
37
  ```C#
4
38