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

回答編集履歴

1

追記

2019/03/31 12:37

投稿

YAmaGNZ
YAmaGNZ

スコア10679

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