等待foreach循环内的按钮单击

时间:2010-11-20 20:34:56

标签: c# foreach

我想在我的应用程序中创建一个逻辑,如下所示

foreach(item in collection)
{
   //do something...wait for a button click (pause until button is clicked)
   //after button is clicked do another thing 
}

经过几个小时的谷歌搜索后,我才知道它可以处理线程。我不熟悉这个。如果有人能解释问题那就太好了。 我将不胜感激任何帮助

根据您的要求,让我解释更多详情

我想比较DataTable对象的一个​​colums中的内容。假设此列中有10行,每行中有一个不同的单词。我想将每个单词与用户在TextBox控件中输入的单词进行比较。显示第1行,用户必须在文本框中写入。将它放入TextBox后,他必须通过单击按钮确认它,这将重复9次。

foreach(DataRow dr in DataTab.Rows)<br/>
{
    string wordFromDB = dr["words"].ToString()
    //wait for a button click (pause until button is clicked)
    string wordFormTextBox = TextBox1.Text

    if( wordFormDB==wordFormTextBox)
    {
        Label1.Text="ok";
    }
    else
    {
        Label1.Text="nok";
    }
}
像这样的事情。当然,如果有不同的方法,我对此感兴趣。

2 个答案:

答案 0 :(得分:1)

这应该在一个单独的线程中完成,因为如果你在主线程中执行它,你将基本上杀死应用程序。所以你首先要声明一个同步事件:

private static AutoResetEvent _wait = new AutoResetEvent(false);

然后将工作线程排队以完成工作:

ThreadPool.QueueUserWorkItem(state =>
{
    foreach (item in (IEnumerable<Foo>)state)
    {
        // This will block the thread until the event is signaled
        _wait.WaitOne();

        // At this point the button was clicked => do something else
    }
}, collection);

点击按钮即可显示事件:

private void Button1_Click(object sender, EventArgs e)
{
    _wait.Set();
}

备注:foreach循环有点奇怪。我不太明白你想用它实现什么。

答案 1 :(得分:0)

请勿使用线程执行此操作。它们是 EVIL ......无论如何,解决像这样简单的问题,因为线程的复杂和怪异并不好。

我建议保留一个变量,例如 lastItem ,它将保存您经历的las项目的索引/键。然后,当单击该按钮时,调用将执行所需操作的函数,递增 lastItem 变量,然后重复 - 等待按钮单击。

你的想法的另一个问题是它可能会导致无限循环 - 如果线程等待按钮点击会以某种方式失败,你可能不会有任何想法,因为它将被困在等待新闻..