You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#:如何检测方法是从临界区还是外部调用?

同步问题调试守卫方案

前置条件

我需要在大型遗留“意大利面”代码库中修复同步问题。部分类必须进行同步,但这些类的调用场景繁多,因此我希望通过调试守卫来捕获问题。以下是一种用于报告类调用问题的思路:

调试用类

public class AsyncChecker {

    private readonly Thread myThread;
    private volatile bool myTurnedOn;

    public AsyncChecker() {
        myThread = Thread.CurrentThread;
        myTurnedOn = false;
    }

    public void turnOn() {
        myTurnedOn = true;
    }

    public void checkThread() {
        if ( myTurnedOn && Thread.CurrentThread != myThread ) {
            Debug.LogError( "非法线程访问" );
        }
    }

    public void checkMultiThreadSafety() {
        if ( myTurnedOn ) {
            // 需要实现代码来判断方法是否从临界区调用
            // 即使同一线程调用也要能检测,而Monitor.IsEntered()仅在其他线程调用时生效
        }
    }
}

存在并发访问风险的遗留类

public class SomeLogic {

    private readonly AsyncChecker myAsyncChecker = new AsyncChecker();

    public void logicOne() {
        myAsyncChecker.checkMultiThreadSafety();
        // 业务逻辑A
    }

    public void logicTwo() {
        myAsyncChecker.checkMultiThreadSafety();
        // 业务逻辑B
    }
}

预期目标

public void someMethodInDeepLegacyCode() {
    lock (someLock) {
        someLogicClassInstance.logicOne();
    }
}
public void anotherSomeMethodInDeepLegacyCode() {
    someLogicClassInstance.logicTwo(); // 此处未加同步就访问,希望触发异常、断言或错误日志等提示
}

Monitor.IsEntered仅能部分满足需求:仅当从其他线程调用时有效,同一线程调用时无法判断。

内容的提问来源于stack exchange,提问作者zhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 15:00:49