我想在我的应用程序中创建一个逻辑,如下所示
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";
}
}
像这样的事情。当然,如果有不同的方法,我对此感兴趣。
答案 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 变量,然后重复 - 等待按钮单击。
你的想法的另一个问题是它可能会导致无限循环 - 如果线程等待按钮点击会以某种方式失败,你可能不会有任何想法,因为它将被困在等待新闻..