Дождитесь нажатия кнопки внутри цикла foreach - PullRequest
0 голосов
/ 20 ноября 2010

Я хочу создать в своем приложении логику, показанную ниже

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

После нескольких часов поиска в Google, я знаю только одно: его можно обрабатывать потоками.Я не знаком с этим.Если кто-то может объяснить проблему, было бы неплохо.Я буду признателен за любую помощь

По вашему запросу позвольте мне объяснить более подробно

Я хочу сравнить содержимое в одном из столбцов объекта DataTable.Допустим, в этом столбце 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 ]

1 голос
/ 20 ноября 2010

Это должно быть сделано в отдельном потоке, потому что если вы сделаете это в основном потоке, вы в основном убьете приложение.Итак, вы должны начать с объявления события синхронизации:

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 немного странный.Я не совсем понимаю, чего вы пытаетесь достичь с помощью этого.

0 голосов
/ 20 ноября 2010

Не делайте этого с потоками.Они ЗЛО ... В любом случае, решение такой простой задачи с помощью чего-то сложного и чудовищного, как нити, нехорошо.

Я бы предложил оставитьпеременная, например lastItem , которая будет содержать индекс / ключ для элемента las, через который вы прошли.Затем при нажатии кнопки вызовите функцию, которая выполнит необходимое действие, увеличьте значение переменной lastItem , а затем повторите - дождитесь нажатия кнопки.

Другая проблема с вашей идеей будетбудь то, что это может потенциально привести к бесконечному циклу - если поток, ожидающий нажатия кнопки, каким-то образом потерпит неудачу, вы могли бы не иметь ни малейшего представления, поскольку он застрянет в ожидании нажатия ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...