我正在使用c#(在VS2012上工作 - .Net 4.5)实现调试器,它应该如下工作:(这是一个使用msscript.ocx控件的vbscript调试器)
在带断点的行上它应该等待{F5}键,并且在有{F5}键时它应该移动到下一个代码行。
现在的问题是,在调试方法中(此方法在命中断点时调用)继续在循环中移动检查静态变量设置为true(控件上的按键事件将此静态变量设置为true )。
应用程序没有响应,我必须停止它。
以下是代码:
以下代码在TextBox的KeyPress事件中实现: 只要它收到{F5}键,它就会在静态变量中设置为真。
static bool dVar;
private void fctb_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.F5)
{
//Setting the static variable true when the control recieves a {F5} key
dVar = true;
}
}
现在点击断点后面的函数被称为
public void DebugIT()
{
dVar=false
//Waits for the {F5} key press by checking for the static variable
//The Application goes Un-Responsive on this Loop and stops accepting keys
while (dVar!=true)
{
System.Threading.Thread.Sleep(1000);
}
}
}
这里的问题是,当它进入while循环时,它会停止接受按键并且没有响应。
需要一种暂停代码执行的方法,直到它收到所需的按键。
或者
我们是否可以有一个单独的线程来检查{F5}键按下并且不会使应用程序无响应。
有人可以帮忙吗?
答案 0 :(得分:1)
以下是如何执行此操作的示例 如果您希望使用此确切代码,请创建一个新表单并拖放两个按钮和一个文本框。
public partial class Form1 : Form
{
ManualResetEvent man = new ManualResetEvent(false);
public Form1()
{
InitializeComponent();
button1.Click += button1_Click;
button2.Click += button2_Click;
}
private async void button1_Click(object sender, EventArgs e)
{
textBox1.Enabled = false;//Do some work before waiting
await WaitForF5(); //wait for a button click or a key press event or what ever you want
textBox1.Enabled = true; //Continue
}
private Task WaitForF5()
{
return Task.Factory.StartNew(() =>
{
man.WaitOne();
man.Reset();
}
);
}
private void button2_Click(object sender, EventArgs e)
{
man.Set();
}
}
在上面的示例中,当您单击button1时,文本框被禁用,当您按下第二个按钮时,将再次启用。 这是在不阻止UI
的情况下完成的答案 1 :(得分:0)
您需要在while循环中添加DoEvents。请参阅MSDN
中的示例