2013-10-17 30 views
5

我正在试图找到一个优雅的执行(..)方法,该方法需要一个lambda表达式。我试图做甚至可能吗?看起来我应该能够,因为编译器将允许我传递这样一个lambda表达式(以Action的形式)。基于异步注释执行C#Lambda表达式

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其中Func<Task>而不是Action。你当然需要小心你在做什么,当然 - 你很可能不要想要阻止正在执行的线程。您也可以考虑将这个作为异步方法。 (目前还不清楚你的Execute方法是否只是打电话给代理人 - 大概是在某处添加价值。)

例如,假设你实际上正在做这个计时的目的。你可能有:

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

感谢乔恩,我很感激我知道如何实现问题中使用AsyncStateMachineAttribute概述。在这种特殊情况下,我试图避免单独的过载......这是一个边缘案例。 –

+0

@CraigSmitham:那么你可以使用'Delegate.Method'属性来获得'MethodInfo',然后使用'method.IsDefined(typeof(AsyncStateMachineAttribute),false)'来检查它的存在。但这并非万无一失 - 没有任何东西可以阻止某个人自己使用属性。 –

+0

一旦我检查它,我将如何将它作为Func 来执行它?我似乎无法从无效的异步lambda中提取Func 。 –