Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

Since I can define an Action as

Action a = async () => { };

Can I somehow determine (at run time) whether the action a is async or not?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
317 views
Welcome To Ask or Share your Answers For Others

1 Answer

No - at least not sensibly. async is just a source code annotation to tell the C# compiler that you really want an asynchronous function/anonymous function.

You could fetch the MethodInfo for the delegate and check whether it has an appropriate attribute applied to it. I personally wouldn't though - the need to know is a design smell. In particular, consider what would happen if you refactored most of the code out of the lambda expression into another method, then used:

Action a = () => CallMethodAsync();

At that point you don't have an async lambda, but the semantics would be the same. Why would you want any code using the delegate to behave differently?

EDIT: This code appears to work, but I would strongly recommend against it:

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);
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...