基于异步注释执行C#Lambda表达式

时间:2013-10-17 20:47:47

标签: c# .net asynchronous lambda functional-programming

我试图在下面找到一个优雅的Execute(..)方法实现,它接受一个lambda表达式。我正在努力做甚么可能吗?看起来我应该能够,因为编译器将允许我传递这样的lambda表达式(以Action的形式)。

    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方法?

1 个答案:

答案 0 :(得分: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;
}