Ponieważ można zdefiniować działanie jakoSprawdź, czy działania jest asynchroniczny lambda
Action a = async() => { };
można jakoś ustalić (w czasie pracy), czy działanie jest asynchroniczne czy nie?
Ponieważ można zdefiniować działanie jakoSprawdź, czy działania jest asynchroniczny lambda
Action a = async() => { };
można jakoś ustalić (w czasie pracy), czy działanie jest asynchroniczne czy nie?
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);
}
}
Rozumiem. Dziękuję za odpowiedź! –
Moja ciekawość jest coraz lepsza ode mnie. Dlaczego zdecydowanie zalecałbyś przeciw niemu? –
@ DavidBožjak: Moja ciekawość jest coraz lepsza ode mnie. Dlaczego chcesz używać tego kodu? – Brian
Oczywiście, można to zrobić.
private static bool IsAsyncAppliedToDelegate(Delegate d)
{
return d.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null;
}
W takim przypadku nie wiesz, czy tak jest, czy nie? – musefan
@musefan, gdy jest to wejście do biblioteki DLL –