2013-10-17 10 views
5

ラムダ式を取り入れたExecute(..)メソッドの洗練された実装を探しています。私がしようとしていることは可能なのでしょうか?コンパイラが(アクションの形で)このようなラムダ式を渡すことができるようになるはずです。非同期アノテーションに基づくC#ラムダ式の実行

static void Main(string[] args) 
    { 
     // This should execute SomeOperation() synchronously 
     Execute(() => SomeOperation()); 

     // This should begin execution of SomeOperationAsync(), but not wait (fire and forget) 
     Execute(() => SomeOperationAsync()); 

     // This should await the execution of SomeOperationAsync() (execute synchronously) 
     Execute(async() => await SomeOperationAsync()); 
    } 

上記のExecuteメソッドはどのように実装しますか?

答えて

4

あなたが渡されたデリゲートのメソッドにAsyncStateMachineAttributeという注釈が付いているかどうかをチェックしますが、正にそうではありません。そのような実装の詳細を使用して、問題を尋ねるだけです。

代わりにExecuteAsyncDelegateの別のオーバーロードがあり、Actionの代わりにFunc<Task>が必要でした。あなたはその中で何をしているのか慎重に考える必要があります - あなたはおそらくではありませんは実行スレッドをブロックしたいだけです。 このも非同期メソッドにすることを検討してください。 (あなたのExecuteメソッドがデリゲートを呼び出すだけではないことは明らかです - おそらくそれはどこかの値を追加していると思われます)。

たとえば、実際にタイミング目的でこれを行っていたとします。

static async Task<TimeSpan> BenchmarkAsync(Func<Task> func) 
{ 
    Stopwatch sw = Stopwatch.StartNew(); 
    await func(); 
    sw.Stop(); 
    return sw.Elapsed; 
} 
+0

ありがとうございましたJon、私はAsyncStateMachineAttributeを使用して質問で概説されていることをどのように達成するかを知っていただければ幸いです。この特定のケースでは、私は別々の過負荷を避けようとしています...それは最悪のケースです。 –

+0

@CraigSmitham: 'Delegate.Method'プロパティを使って' MethodInfo'を取得し、 'method.IsDefined(typeof(AsyncStateMachineAttribute)、false)'を使ってその存在を確認することができます。しかし、誰かが属性を適用するのを止めることは何もありません。 –

+0

私はそれを確認したら、それを実行するにはどのようにFunc として扱いますか?空の非同期ラムダからFunc を抽出することはできません。 –

関連する問題