2016-10-17 4 views
2

私は偶然、解決できた問題にぶつかりました。しかし、私はエラーコードがコンパイルできた理由を理解できないことを心配しています(最初は)。続きパラメータ化されたアクション

は罰金コンパイルエラー-EDコード、次のとおりです。

Task<string> myTask = Task<string>.Factory.StartNew(() => 
      { 
       System.Threading.Thread.Sleep(1000); 
       return "mystrineg"; 
      }); 
      myTask.ContinueWith(t => action, CancellationToken.None, 
       TaskContinuationOptions.NotOnFaulted, TaskScheduler.Default); 

上記のコードで問題がある:actionが全く呼び出されません。ここ は私が作った修正です:

Task<string> myTask = Task<string>.Factory.StartNew(() => 
      { 
       System.Threading.Thread.Sleep(1000); 
       return "mystrineg"; 
      }); 
      myTask.ContinueWith(t => action(t.Result), CancellationToken.None, 
       TaskContinuationOptions.NotOnFaulted, TaskScheduler.Default); 

私の質問は、なぜコンパイラは、引数なしでパラメータ化アクションを呼び出すことができるようにされていますか?

+0

すべての答えは正しいです。しかし、私は早く到着したものを選択しなければなりませんでした。皆さん、ありがとうございました! – James

答えて

2

私の質問は、なぜ引数なしでパラメータ化されたアクションを呼び出すことができるのですか?

それはしていません。最初のバージョンでは、actionはまったく呼び出されませんでした。引数がなくても。実際に呼び出すには、ラムダなしで直接渡すか、空のペアの()を呼び出す必要があります。

action;は有効な文ではありませんが、.ContinueWithAction<Task>を取るだけでなく、Func<Task, T>、それはあなたのactionが持っているものは何でもタイプを返す、あなたが渡された正確に何...タスクを取る機能があるだけでなく、:t => action;

2
t => action 

の略である。従って

t => { return action; } 

結果。

3

最初のコードではoverloadが使用され、アクションデリゲートを返すだけで何も実行されません。

実際に必要なオーバーロードはthisであり、2番目のコードで実際に使用され、アクションが実行されます。

私はdangerousにできるTask.Factory.StartNewの代わりにContinueWithTask.Runの代わりにasync and awaitを使用しなかったのだろうかと思います。

あなたのコードは非常に簡単になります

Task<string> myTask = Task.Run(() => 
         { 
          System.Threading.Thread.Sleep(1000); 
          return "mystrineg"; 
         }); 
string str = await myTask; 
action(str); 
+0

非常に有効なポイントです。しかし、コードは古く、.Net 4.5を使用する方法はありません。 – James

関連する問題