2013-09-26 24 views
7

Kể từ khi tôi có thể xác định một hành động nhưKiểm tra xem hành động là async lambda

Action a = async() => { }; 

Tôi có thể bằng cách nào đó xác định (tại thời gian chạy) cho dù hành động một là async hay không?

+0

Trường hợp nào bạn chưa biết có đúng hay không? – musefan

+3

@musefan khi nó là một đầu vào vào một dll khung –

Trả lời

13

Không - ít nhất là không hợp lý. async chỉ là chú thích mã nguồn để báo cho trình biên dịch C# biết rằng bạn thực sự muốn có hàm không đồng bộ/chức năng ẩn danh.

Bạn có thể tìm nạp số MethodInfo cho đại biểu và kiểm tra xem liệu thuộc tính đó có thuộc tính thích hợp được áp dụng cho đại biểu hay không. Cá nhân tôi sẽ không mặc dù - sự cần thiết phải biết là một mùi thiết kế. Đặc biệt, hãy xem xét điều gì sẽ xảy ra nếu bạn refactored hầu hết các mã ra của biểu thức lambda vào phương pháp khác, sau đó sử dụng:

Action a =() => CallMethodAsync(); 

Vào thời điểm đó bạn không có một lambda async, nhưng ngữ nghĩa sẽ giống nhau. Tại sao bạn muốn bất kỳ mã nào sử dụng đại biểu để hành xử khác nhau?

EDIT: Mã này xuất hiện để làm việc, nhưng tôi sẽ khuyên chống lại nó:

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

Tôi hiểu. Cảm ơn câu trả lời! –

+2

Sự tò mò của tôi đang trở nên tốt hơn cho tôi. Tại sao bạn mạnh mẽ khuyên bạn nên chống lại nó? –

+0

@ DavidBožjak: Sự tò mò của tôi đang trở nên tốt hơn cho tôi. Tại sao bạn muốn sử dụng mã này? – Brian

3

Tất nhiên, Bạn có thể làm điều đó.

private static bool IsAsyncAppliedToDelegate(Delegate d) 
{ 
    return d.Method.GetCustomAttribute(typeof(AsyncStateMachineAttribute)) != null; 
} 
Các vấn đề liên quan