解决 暂时停止执行

加入
2019年4月5日
消息
13
编程经验
10+
我正在为我们的组织编写一种AI Chatbot,允许用户"chat"与该计划并要求帮助"I forgot my password", "I lost my J drive" …

一切都很顺利,但太好了。用户询问问题的分钟,立即呈现给用户,似乎是不自然的。所以我添加了一个标签说"Typing ..."并隐藏它。当呈现响应时,我想制作标签可见,等待一段时间,隐藏标签并继续前进。

这是软件的概述

用户类型问题和输入放在RichTextBox中。
找到了适当的回应。
**显示打字**
向RichTextBox添加响应
**停止显示打字**
如果有其他意见
**显示打字**
添加其他评论
**停止显示打字**
......

**显示打字**的逻辑是:
公共静态void键入(字符串文本,标签LBL)
{
lbl.Visible = true;
thread.sleep((text.length / 3)* 1000); //普通人类型3个字符一秒。这样做,我可以暂停平均长度
//时间键入显示的文本。
lbl.Visible = false;
}

=====
我的问题是:通过上面的代码,当用户键入它们的输入时,它会暂停它,无论是什么帖子。永远不要再暂停,所以电脑响应在第一次暂停后立即出现。我从未看到过得可见的标签。我做错了什么?我可能做了一个可怕的工作解释了这一点。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
If the thread sleeps then it's because you are calling Thread.Sleep. It won't randomly execute code that you didn't call. The issue is likely that that call is made before the UI thread can actually repaint the screen, so you never actually see the Label you made visible. Instead of Thread.Sleep, which should pretty much NEVER be called on the UI thread, try calling Task.Delay. That should wait at that point for the specified time before continuing without preventing things like the UI being repainted.
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
我应该指出,您需要等待该调用,因此您需要声明调用ISync的方法:
C#:
public static async Task Typing(string text, Label lbl)
{
    lbl.Visible = true;
    await Task.Delay((text.Length / 3) * 1000); // Average person types 3 characters a second. In doing this I can pause the average length of
    // time to type the text being shown.
    lbl.Visible = false;
}
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
Also, it would make more sense to use text.Length * 333 rather than (text.Length / 3) * 1000. That's because an int divided by an int will always produce an int and discard the remainder, so 2/3 will produce 0, 11/3 will produce 3, etc.
 
加入
2019年4月5日
消息
13
编程经验
10+
谢谢jmplhinney。我尝试了你建议的东西,但是当我用你的建议时,我甚至没有得到暂停。以下是我的实际代码。也许很快就可以看到我搞砸的地方。否则,我将只是桌面。 FYI,这"name"电脑是巴林顿。我被安置了
左边边缘的行斜线很容易向您展示我在哪里呼唤例程。

C#:
public static void BarringtonTyping(string response, Label lbl)
{
    lbl.Visible = true;
    Task.Delay(500);
    lbl.Visible = false;
}

private void txtInput_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        // Add the user's input into the transcript.
        Transcript.Update(Globals.User.firstName, txtInput.Text, rtbTranscript,false);

        // Parse the input to find the appropriate response.
        int id = AI.ParseQuestionForID(txtInput.Text);

        // Now that we have found the appropriate response, run it.
        string response = AI.DoResponse(id);

        // Let's make sure we got a response
        if (!String.IsNullOrEmpty(Barrington.Text.ExtractStringFromTag(response, "response")))
        {
            // If this response completes the task, clear the dialogTopic global
            if (!String.IsNullOrEmpty(Barrington.Text.ExtractStringFromTag(response, "complete").Trim()))
            {
                Globals.Barrington.dialogTopic = "";
            }

            // Set a topic if this conversation is going to continue
            if (!String.IsNullOrEmpty(Barrington.Text.ExtractStringFromTag(response, "topic").Trim()))
            {
                Globals.Barrington.dialogTopic = Barrington.Text.ExtractStringFromTag(response, "topic").Trim();
            }

            // Display the response from Barrington
            bool _answer = false;
            if (!String.IsNullOrEmpty(Barrington.Text.ExtractStringFromTag(response, "answer").Trim()))
            {
                if (Barrington.Text.ExtractStringFromTag(response, "answer").Trim().ToLower() == "true")
                {
                    _answer = true;

                    // Clear the conversation topic
                    Globals.Barrington.dialogTopic = "";
                }
            }
            ///////
            ///////
            BarringtonTyping(response, lblBarringtonTyping);
            Transcript.Update("", Barrington.Text.ExtractStringFromTag(response, "response"), rtbTranscript, _answer);

            // Display any additional comments
            if (!String.IsNullOrEmpty(Barrington.Text.ExtractStringFromTag(response, "additionalComment").Trim()))
            {
                string[] _additional = Barrington.Text.ExtractStringFromTag(response, "additionalComment").Split('|');
                foreach (string addcomment in _additional)
                {
                    //
                    Transcript.Update("", addcomment, rtbTranscript);
                }
            }

            // If this is not an ongoing conversation, ask if Barrington can do anything
            // else
            if (String.IsNullOrEmpty(Globals.Barrington.dialogTopic))
            {
                if (Barrington.Text.ExtractStringFromTag(response, "suppress").Trim().ToLower() != "true")
                {
                    response = AI.Remarks("Closing");
                    //
                    Transcript.Update("", response, rtbTranscript);
                }
            }
        }

        txtInput.Clear();
        e.SuppressKeyPress = true;
        rtbTranscript.Select(rtbTranscript.Text.Length, 0);
        rtbTranscript.ScrollToCaret();
    }
}
 
最后编辑了主持人:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,732
地点
悉尼,澳大利亚
编程经验
10+
如果在线程中编辑第一篇文章,则可以设置 字首回答 或者 解决。虽然它不是一个艰难而快速的规则,但我建议使用 回答 如果您只是要求信息和 解决 如果您想要帮助解决代码问题。另外,请设置 字首问题 每当发布新问题时。

你也可以 喜欢 如果您发现它有用,别人的帖子。
 
加入
2019年4月5日
消息
13
编程经验
10+
快速问题:这样做的原因是这样一个标签会出现说"Typing",暂停一下,然后隐藏标签。把它带到一个下一级,我有一个声音,就像键入的人一样。有没有办法在任务期间可以获得WAV .delay?
 
最佳 底部