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