2013-09-26 14 views

Odpowiedz

13

Nie - przynajmniej nie sensownie. async to tylko adnotacja kodu źródłowego informująca kompilator C#, że naprawdę chcesz asynchroniczną funkcję/anonimową funkcję.

Możesz może pobrać MethodInfo dla delegata i sprawdzić, czy ma odpowiedni atrybut zastosowany do niego. Osobiście jednak nie chciałbym - trzeba wiedzieć, to zapach designu. W szczególności należy wziąć pod uwagę to, co by się stało, jeśli refactored większość kodu z wyrażenia lambda w inny sposób, a następnie wykorzystywane:

Action a =() => CallMethodAsync(); 

W tym momencie ty nie mieć lambda asynchronicznej, ale semantyka byłby taki sam. Dlaczego miałbyś chcieć, aby jakikolwiek kod używający delegata zachowywał się inaczej?

EDIT: Ten kod wydaje się działać, ale byłoby Odradzamy nim:

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

Rozumiem. Dziękuję za odpowiedź! –

+2

Moja ciekawość jest coraz lepsza ode mnie. Dlaczego zdecydowanie zalecałbyś przeciw niemu? –

+0

@ DavidBožjak: Moja ciekawość jest coraz lepsza ode mnie. Dlaczego chcesz używać tego kodu? – Brian

3

Oczywiście, można to zrobić.

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