Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在win应用程序中暂停执行并等待按键?_C#_Debugging_Vbscript_Keypress - Fatal编程技术网

C# 如何在win应用程序中暂停执行并等待按键?

C# 如何在win应用程序中暂停执行并等待按键?,c#,debugging,vbscript,keypress,C#,Debugging,Vbscript,Keypress,我正在使用c#实现一个调试器(在VS2012--.NET4.5上工作),它的工作原理如下:(这是一个使用msscript.ocx控件的vbscript调试器) 在具有断点的行上,它应该等待{F5}键,在具有{F5}键后,它应该移动到下一个代码行 现在的问题是,在调试方法中(在命中断点时调用此方法)继续在循环中移动,检查是否将静态变量设置为true(控件上的按键事件将此静态变量设置为true) 应用程序没有响应,我必须停止它 下面是它的代码: 以下代码在文本框的按键事件中实现: 每当它收到一个{F

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

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

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

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

下面是它的代码:

以下代码在文本框的按键事件中实现: 每当它收到一个{F5}键时,它就会在一个静态变量中设置true

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}键的按下,并且不会使应用程序失去响应


有人能帮忙吗?

您需要将DoEvents添加到while循环中。参见

中的示例这里是一个如何实现此目的的示例。
如果您想让这段代码正常工作,请创建一个新表单并在其上拖放两个按钮和一个文本框

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();
    }
}
在上面的示例中,当您单击按钮1时,文本框被禁用,当您按下第二个按钮时,文本框再次被启用。
这是在不阻塞UI的情况下完成的

谢谢您的回复,但对我来说不起作用。添加DoEvents对我很有效,因为使用Async方法会移动该方法的控件调用方,但根据我的需要,它应该暂停执行。