5

我试图在下面找到一个优雅的 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 方法?

4

1 回答 1

4

可以检查您传递的委托的基础方法是否带有注释AsyncStateMachineAttribute- 但老实说,我不会。它只是自找麻烦,使用这样的实现细节。

相反,我将有一个单独的重载,ExecuteAsyncDelegate它需要 aFunc<Task>而不是 just Action。当然,你需要小心你在其中所做的事情——你很可能不想仅仅阻塞正在执行的线程。您可能还想考虑将设为异步方法。Execute(除了调用委托之外,您的方法的用途尚不清楚- 大概它在某处增加了价值。)

例如,假设您实际上是出于计时目的而这样做。你可能有:

static async Task<TimeSpan> BenchmarkAsync(Func<Task> func)
{
    Stopwatch sw = Stopwatch.StartNew();
    await func();
    sw.Stop();
    return sw.Elapsed;
}
于 2013-10-17T20:55:16.263 回答