C# 如何接受带有独立线程的按键?

C# 如何接受带有独立线程的按键?,c#,multithreading,keypress,C#,Multithreading,Keypress,我正在使用c#实现一个调试器,它的工作原理如下: (这是一个使用msscript.ocx控件的vbscript调试器) 在具有断点的行上,它应该等待{F5}键,在具有{F5}键后,它应该移动到下一个代码行 现在的问题是,在调试方法中(在命中断点时调用此方法) 在循环中不断移动,检查是否将静态变量设置为true(控件上的按键事件将此静态变量设置为true) 应用程序没有响应,我必须停止它 下面是它的代码: 下面的代码是为控件编写的,用于接受控件上的{F5}键(例如textbox控件) 在断点命中后

我正在使用c#实现一个调试器,它的工作原理如下: (这是一个使用msscript.ocx控件的vbscript调试器)

在具有断点的行上,它应该等待{F5}键,在具有{F5}键后,它应该移动到下一个代码行

现在的问题是,在调试方法中(在命中断点时调用此方法) 在循环中不断移动,检查是否将静态变量设置为true(控件上的按键事件将此静态变量设置为true)

应用程序没有响应,我必须停止它

下面是它的代码:

下面的代码是为控件编写的,用于接受控件上的{F5}键(例如textbox控件)

在断点命中后运行的另一个方法在继续之前检查dVar值: 它是这样的:

while (!dVar)
{
System.Threading.Thread.Sleep(100); 
}
这里的问题是,当它进入while循环时,它停止接受按键并没有响应

需要一种暂停代码执行直到收到所需按键的方法

我们可以有一个单独的线程来检查{F5}键的按下,并且不会使应用程序失去响应


有人能帮忙吗?

这个问题和答案真的很难理解

首先,使用
F10
作为步进键,这在当今相当标准

要在按键时锁定程序,可以使用以下方法:

while (Console.ReadKey().Key != ConsoleKey.F11);
这很好,因为它不会循环。
ReadKey()
方法暂停执行,直到实际按下某个键为止。因此,这里不会浪费CPU资源


编辑:带有静态变量的windows窗体

在您的评论中,您发布了以下代码:

private void fctb_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.F5)
    {
        dVar = true;
    }
}
您现在需要做的就是在处理事件后立即重置另一个方法/线程上的值:

// some code...

while (!dVar)
{
    System.Threading.Thread.Sleep(100); // don't ever loop without throttling CPU down
}

dVar = false; // event handled

// some code...

您用什么语言编写?您为哪个操作系统编写调试器?它是基于Windows的应用程序,因此我们可以在Windows应用程序上使用ReadKey()或其他类似方法。我使用下面的代码来接受key:'private void fctb_KeyPress(object sender,KeyPressEventArgs e)'{''if(e.KeyChar==(char)Keys.F5)'{''dVar=true;''}'}'}'另一个方法然后读取bVar值并继续。可以直接在Windows窗体上等待按键吗?不,不能也不应该在Windows窗体上等待按键。它们是事件驱动的(我的示例是针对控制台应用程序的)。我已经编辑了我的答案,现在我对你的需求有了更多的了解。是的,你的问题是对的。但它仍然不接受任何按键循环。(尝试将投票时间进一步提高到5000-仍然没有响应)我认为你应该发布更多代码(根据S.O.的政策,仍然是最小的,并且只是相关的),几乎不可能理解你在做什么以及为什么。一个新的问题可能会出现。
// some code...

while (!dVar)
{
    System.Threading.Thread.Sleep(100); // don't ever loop without throttling CPU down
}

dVar = false; // event handled

// some code...