11

因为我可以将 Action 定义为

Action a = async () => { };

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

4

3 回答 3

15

不——至少不明智。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);
    }
}
于 2013-09-26T09:16:33.880 回答
4

当然,你可以这样做。

private static bool IsAsyncAppliedToDelegate(Delegate d)
{
    return d.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null;
}
于 2013-09-26T09:26:20.580 回答
0

如果您希望构建一些逻辑,基于是否已将async或lanbda 传递给您的方法 - 只需引入重载async

public void MyMethod(Action action)
{
    DoStuff();
}
public void MyMethod(Func<Task> asyncAction)
{
    DoOtherStuff();
}
于 2021-10-07T20:59:00.540 回答