Многопоточная помощь, еще раз (winForms) - PullRequest
2 голосов
/ 22 октября 2010

Я разработал приложение, которое извлекает X записей из моей базы данных на X потоков. Затем каждый поток повторяет созданные коллекции и выполняет некоторую проверку данных для каждой записи. Как только запись подтверждена / не подтверждена приложением, она обновляется в базе данных как действительная / недействительная. Записи извлекаются каждым потоком, только если в базе данных есть элементы, которые не были запущены через приложение. Есть битовый столбец, чтобы указать, извлекло ли приложение данные. Таким образом, потенциально система может исчерпать данные в зависимости от количества потоков и записей на поток. Я хочу, чтобы приложение продолжало проверять базу данных на наличие записей, которые еще не были запущены, а затем начало процесса создания потоков и, наконец, проверки данных.

Вот пример: В базе 50 записей мы запускаем 5 потоков с 10 записями на поток. Приложение запускается, потоки создаются, записи извлекаются и затем обрабатываются. Теперь в системе нет данных. Пользователь импортирует больше данных в БД. Приложение, все еще ищущее, есть ли какие-либо записи, видит, что в базе данных есть 5 новых записей. Затем он начинает процесс заново, чтобы создать потоки и обработать записи.

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

while(RecordsFound <=0){
 …sleepcode
} ;
RunProcessMethod

Но winform блокируется, очевидно, в течение периода ожидания. Я пытался добавить логику ожидания в другой поток, но боялся, что если я запусту метод процесса из этого потока через делегата, все будет странно, так как я создаю дополнительные потоки внутри этого метода. Мысли?

Ответы [ 2 ]

2 голосов
/ 22 октября 2010

Самый простой способ исправить это - использовать механизм уведомления вместо опроса.То есть, как только вы породили потоки для чтения данных из базы данных, возложите на них ответственность за уведомление пользовательского интерфейса, когда они завершены, вместо того, чтобы пользовательский интерфейс ждал их завершения.

Самый простой способдля этого нужно передать делегат для вызова потоков, когда они будут заполнены найденным набором записей.Пользовательский интерфейс может обновляться, когда записи доступны

delegate void CallBack(List<Data> found);

void OnDataFound(List<Data> found) {
  // Get back on the UI thread
  if ( this.InvokeRequired ) { 
    this.Invoke( new CallBack(OnDataFound), new object[] { found } );
    return;
  } 

   // Update display
}
2 голосов
/ 22 октября 2010

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

Вам не нужно этого бояться.Это правильный способ справиться с этим типом сценария.Нет проблем с фоновым потоком, создающим дополнительные потоки.

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