Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.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# 在使用Task.Delay打印字符时,如何防止在打印期间发生新的按键关闭事件?_C#_Visual Studio - Fatal编程技术网

C# 在使用Task.Delay打印字符时,如何防止在打印期间发生新的按键关闭事件?

C# 在使用Task.Delay打印字符时,如何防止在打印期间发生新的按键关闭事件?,c#,visual-studio,C#,Visual Studio,在我正在构建的游戏中,我有许多表单控件单击事件和按键事件供用户控制。提供的大部分游戏详细信息都是文本,通过任务打印到只读文本框中。慢速打印的延迟方法: async public void delayPrintLine(TextBox console, string output) { string s = output; char[] charArray = s.ToCharArray(); s = "";

在我正在构建的游戏中,我有许多表单控件单击事件和按键事件供用户控制。提供的大部分游戏详细信息都是文本,通过任务打印到只读文本框中。慢速打印的延迟方法:

async public void delayPrintLine(TextBox console, string output)
        {
            string s = output;
            char[] charArray = s.ToCharArray();
            s = "";

            for (int i = 0; i < charArray.Length; i++)
            {
                console.AppendText(charArray[i].ToString());
                await Task.Delay(80);
            }
            console.AppendText(Environment.NewLine);
        }
攻击按钮示例:

private void attackBtn_Click(object sender, EventArgs e)
    {
        if (!activeAction)
        {
            activeAction = true;
            heroAttack();
            currentHP.Text = "HP:  " + hero.HP;
        }
        else
        {
            return;
        }
        activeAction = false;
    }

使用
队列
将事件排成队列,然后逐个处理它们?这是否可以不仅仅用于字符串打印?我可以为我的所有事件处理做到这一点吗?在用户单击按钮或按键时,另一个事件直到所有任务完成后才被注册?我偶然发现System.Threading.SemaphoreSlim,它用异步方法解决了我的问题,但我仍然有一个问题,即事件可以通过按键快速触发。我想有一种方法来限制用户输入事件触发过快。
private void attackBtn_Click(object sender, EventArgs e)
    {
        if (!activeAction)
        {
            activeAction = true;
            heroAttack();
            currentHP.Text = "HP:  " + hero.HP;
        }
        else
        {
            return;
        }
        activeAction = false;
    }