2012-12-14 12 views
6

Tôi muốn cấm reentrancy cho tập hợp lớn các phương pháp.Khuôn khổ có api chuyên dụng để phát hiện sự reentrancy?

đối với phương pháp duy nhất hoạt động mã này:

bool _isInMyMethod; 
void MyMethod() 
{ 
    if (_isInMethod) 
     throw new ReentrancyException(); 

    _isInMethod = true; 
    try 
    { 
     ...do something... 
    } 
    finally 
    { 
     _isInMethod = false; 
    } 
} 

Đây là tẻ nhạt để làm điều đó cho mọi phương pháp.
Vì vậy, tôi đã sử dụng StackTrace lớp:

 public static void ThrowIfReentrant() 
     { 
      var stackTrace = new StackTrace(false); 
      var frames = stackTrace.GetFrames(); 
      var callingMethod = frames[1].GetMethod(); 
      if (frames.Skip(2).Any(frame => EqualityComparer<MethodBase>.Default.Equals(callingMethod,frame.GetMethod()))) 
       throw new ReentrancyException(); 
     } 

Nó hoạt động tốt nhưng trông giống như một hack.

.NET Framework có API đặc biệt để phát hiện sự reentrancy không?

+2

Tại sao bạn quan tâm đến reentrancy? –

+0

Viết mã nơi dự kiến ​​reentrance, sau đó bạn có thể nhập lại nó. – Jodrell

+0

Mã cũ. Chúng tôi có tấn phụ thuộc lẫn nhau giữa các cửa sổ. Hành động đơn lẻ có thể gây ra nhiều đợt lặp lại không cần thiết của các sự kiện, cập nhật, yêu cầu db. Và thật khó để phát hiện mọi vòng lặp như vậy với đôi mắt của một người. –

Trả lời

3

Tôi khuyên bạn nên sử dụng PostSharp để giải quyết vấn đề của mình. Mặc dù có thể tốn kém khi sử dụng công cụ thương mại chỉ vì một lý do cụ thể mà tôi đề nghị bạn xem xét vì công cụ này có thể giải quyết các vấn đề khác phù hợp hơn để được giải quyết bằng AOP (ghi nhật ký, quản lý giao dịch, bảo mật và hơn thế nữa). Trang web của công ty là here và bạn có thể xem qua các ví dụ here. Pluralsight có một khóa học tốt về phương pháp AOP với các ví dụ trong PostSharp here. Chúc may mắn!

+0

Có, chúng tôi có nhiều việc phải làm. Tôi quan tâm đến PostSharp và có nó trong kế hoạch học tập của tôi. Nhưng chúng tôi có thể sẽ bắt đầu với AOP ở dạng đánh chặn động ... sau này, sau khi áp dụng thùng chứa DI thích hợp. =) –

+0

@voroninp - bạn có ý định sử dụng các công cụ như proxy động hay không? – Ikaso

+0

@lkaso yes. Đã xảy ra sự cố với phương pháp này? –

1

Cách tiếp cận thông thường .Net là sử dụng một số cho số synchronization để chặn các chủ đề khác, thay vì làm cho chúng ném ngoại lệ.

+0

Điều đó sẽ không giúp ích gì. Nó không phải là vấn đề của các hoạt động không đồng bộ. Chúng ta chỉ có chu kỳ sự kiện hữu hạn: Một đám cháy sau đó B bắt, làm một cái gì đó, tăng sự kiện xử lý bởi C và C làm điều gì đó với A điều gì gây ra A để nâng cao sự kiện một lần nữa. –