2015-07-05 3 views
0

Когда я нажимаю кнопку, цикл начинает считывать базу данных и отправлять каждую строку запроса на другой сервер. Когда получите ответ - цикл продолжается.Таймер в foreach с ManualResetEvent

код реализуется следующим образом

private ManualResetEvent _mre = new ManualResetEvent(true); 

и

Thread startUpload = new Thread(() => 
{ 
    //read database 

    foreach (DataRow dr in dt.Rows) 
     { 

     //send request 

     _mre.WaitOne(); 
     } 
}); 

startUpload.Start(); 

Проблема заключается в том, что, когда посылаются запросы не могут быть ответом. В моем случае это нормально. Но если нет, ответ приходит, тогда цикл прекращается. Мне нужно сделать внутри таймера цикла, который в случае остановки цикла из-за отсутствия ответа будет продолжать цикл за 30 секунд.

Таймер будет делать

_mre.Set(); 
+0

Где именно проблема? Что вы пытаетесь достичь? Можете ли вы подробнее рассказать об этом? – pasty

+0

@pasty, например, когда в foreach: timer = new System.Threading.Timer (новый TimerCallback (DoSomething), null, 0, 30000); Цикл не ждет ответа. Просто squander – alexander

ответ

2

ВАЖНО: Вы устанавливаете свой ManualResetEvent начальное состояние для true, установите его в false, если вы готовы, чтобы остановить текущий процесс и ждать сигнала.

EDIT:

Пример

private ManualResetEvent _mre = new ManualResetEvent(false); 

private void ReadTheDatabase() 
{ 
    Thread startUpload = new Thread(() => 
    { 
     // Read the data 

     foreach (DataRow dr in dt.Rows) 
     { 
      // Send request 
      Thread requestMethod = new Thread(() => 
      { 
       // Imitate process with thread sleep 
       Thread.Sleep(5000); 
       _mre.Set(); 
      }); 

      requestMethod.Start(); 

      _mre.WaitOne(30000, false); 
     } 
    }); 

    startUpload.Start(); 
} 
+0

Потому что теперь у меня есть этот алгоритм: 1) Прочитайте базу данных, 2) I Принесите временную таблицу, 3) Начните цикл через временную таблицу, 4) Для каждой строки в запросе, 5) Когда приходит ответ и обновленной базы данных, мы продолжаем цикл – alexander

+0

Можно ли продолжить цикл с помощью AutoResetEvent вручную? – alexander

+0

подождите 30 секунд или продолжите вручную – alexander

Смежные вопросы