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?
Tại sao bạn quan tâm đến reentrancy? –
Viết mã nơi dự kiến reentrance, sau đó bạn có thể nhập lại nó. – Jodrell
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. –