c#在for循环中编码定时操作

时间:2017-11-03 16:44:30

标签: c# winforms

我正在编写一段代码,通过引导脚本引导用户。在显示答案之前,用户将有几秒钟的时间回答。

到目前为止,我的代码看起来像这样:

GuidedExercise3 exercise3 = new GuidedExercise3();
string AntonioAnswer = string.Empty; // expected answer

int upperBound = exercise3.Script.Count - 1; // zero-based counting
for(int i = 0; i < upperBound; i += 2)
{
    labelInstructions.Text = exercise3.Script[i].TextToSpeak;
    AntonioAnswer = exercise3.Script[i+1].TextToSpeak; // answer
    SetTimer(AntonioAnswer, txtAntonio); // set timer sending in the answer and the TextBox object.
    sysTimer.Start();
}

List的奇数行包含问题,偶数行包含预期的答案。我的问题是如何显示X秒的问题,然后在此WinForms应用程序中获取用户的答案,然后在计时器过去时显示答案,让用户不要进入脚本的下一步但允许他们回答问题(在文本框中)。

我检查了这个StackOverflow问题,但它不匹配:Implementing a loop using a timer in C#

2 个答案:

答案 0 :(得分:1)

以下是我将如何处理这样的事情:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        MoveNextQuestion();

        timerAnswer.Interval = 5000;
        timerAnswer.Start();
    }

    private string[] _questionsAndAnswers = new[]
    {
        "What colour is the sky?",
        "Blue",
        "What do chickens lay?",
        "Eggs",
    };

    private int _currentIndex = -2;

    private void timerAnswer_Tick(object sender, EventArgs e)
    {
        MoveNextQuestion();
    }

    private void buttonAnswer_Click(object sender, EventArgs e)
    {
        MoveNextQuestion();
    }

    private void MoveNextQuestion()
    {
        _currentIndex += 2;
        if (_currentIndex < _questionsAndAnswers.Length)
        {
            labelQuestion.Text = _questionsAndAnswers[_currentIndex];
        }
        else
        {
            timerAnswer.Stop();
        }
    }
}

答案 1 :(得分:-1)

我能够使用BackgroundWorker对象轻松地完成此工作。有关确切的编码,请参阅MSDN上的以下文章。 BackgroundWorker Class。特别是他们在文档中有两个例子,第一个例子就足够了。 BackgroundWorker类允许我的UI在等待定时答案时继续接受用户输入。它在RunWorkerComplete事件上显示正确的答案。因此,在我的for循环中调用BackgroundWorker的RunAsync。

我遇到了BackgroundWorker的另一个问题,即没有将控制权返回给我的循环。我正在分别研究这个问题。