检查Action是否为异步lambda

时间:2013-09-26 09:13:06

标签: c# async-await

因为我可以将Action定义为

Action a = async () => { };

我可以以某种方式确定(在运行时)动作a是否是异步的吗?

2 个答案:

答案 0 :(得分:13)

不 - 至少不明智。 async只是一个源代码注释,告诉C#编译器你真的想要一个异步函数/匿名函数。

可以获取代理的MethodInfo并检查它是否已应用适当的属性。我个人不会 - 需要知道的是设计气味。特别是,考虑如果将lambda表达式中的大部分代码重构为另一个方法会发生什么,然后使用:

Action a = () => CallMethodAsync();

此时你有一个异步lambda,但语义是相同的。为什么您希望使用委托的任何代码表现不同?

编辑:此代码似乎有效,但我强烈建议反对

using System;
using System.Runtime.CompilerServices;

class Test
{
    static void Main()        
    {
        Console.WriteLine(IsThisAsync(() => {}));       // False
        Console.WriteLine(IsThisAsync(async () => {})); // True
    }

    static bool IsThisAsync(Action action)
    {
        return action.Method.IsDefined(typeof(AsyncStateMachineAttribute),
                                       false);
    }
}

答案 1 :(得分:4)

当然,你可以这样做。

private static bool IsAsyncAppliedToDelegate(Delegate d)
{
    return d.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null;
}