有啥方法可以在 C#/Visual Studio 的断点上睡觉?
Posted
技术标签:
【中文标题】有啥方法可以在 C#/Visual Studio 的断点上睡觉?【英文标题】:Any way to sleep on a breakpoint in C# / Visual Studio?有什么方法可以在 C#/Visual Studio 的断点上睡觉? 【发布时间】:2015-11-20 05:48:30 【问题描述】:在 C#/Visual Studio 中遇到断点时,有什么方法可以将当前线程的执行延迟指定的时间段? 休眠后,应继续执行。
我知道 VS 中有一个“当命中”功能,它允许在遇到断点时执行任意代码(主要是将信息打印到控制台),但它非常有限;它不允许将Thread.Sleep
或任何耗时的操作(如for
循环)放在那里。也不允许使用委托/lambda 函数。
我正在使用 Visual Studio 2012。
【问题讨论】:
我怀疑你能做到这一点......你为什么不直接把 sleep 放在你的代码中? 添加到@Thomas - 可能使用如下构造:if (System.Diagnostics.Debugger.IsAttached && maybeSomeOtherCondition) // Sleep
。
我认为断点表达式求值器使用断点处的上下文。如果您的程序有一个执行睡眠的函数,该函数可以通过您的断点从该函数访问,您可以调用它(也许它返回一个虚拟 int 值?)但是由于这可能需要您更改代码,它可能不是什么你在追求。
Thomas,因为它需要重建整个项目,而且在我的特殊情况下非常耗时。顺便说一句,我目前正在这样做,但它很烦人。
@Corak,它需要重建,但基本上问题是是否有可能不重建。
【参考方案1】:
我有一个需要一次性重新编译的本机解决方案。如果需要,我确信它可以翻译成 C#。
定义这个结构:
struct THREAD_DATA
int ms;
DWORD id;
THREAD_DATA(DWORD _id, int _ms) : id(_id), ms(_ms) ;
;
还有这两个功能:
DWORD WINAPI PauseThread(LPVOID p)
THREAD_DATA* ptd = (THREAD_DATA*)p;
HANDLE target = OpenThread(THREAD_SUSPEND_RESUME, FALSE, ptd->id);
SuspendThread(target);
Sleep(ptd->ms);
ResumeThread(target);
delete p;
return 0;
void PauseCurrentThread(int ms)
THREAD_DATA* ptd = new THREAD_DATA(GetCurrentThreadId(), ms);
HANDLE h = CreateThread(NULL, 0, &PauseThread, (LPVOID)ptd, 0, 0);
当您在断点上时,使用立即窗口运行:
PauseCurrentThread(5000)
或任何您的延迟毫秒数。
如果您想在多个项目中执行此操作而无需检测 - 我可能会开发一个 Visual Studio 扩展来自动执行此操作。
【讨论】:
以上是关于有啥方法可以在 C#/Visual Studio 的断点上睡觉?的主要内容,如果未能解决你的问题,请参考以下文章
有啥方法可以在 NVIDIA 显卡上的 Visual Studio 中运行程序调试?
有啥方法可以直接从命令行查看可用于 Visual Studio 的 Nuget 包源
Visual Studio Code - 有啥方法可以分别突出显示不同类型的错误和警告?
Visual Studio 解决方案——有啥方法可以创建一个“特殊”文件夹?