Вот что я бы сделал (или подобное):
bool done = false;
while(true)
{
string foundstring;
done = searchforstring(out foundstring);
if(done)
break;
// Not done, so take what we found and add it to the listbox
this.BeginInvoke(new Action<string>(delegate(string input)
{ this.listBox.BeginUpdate(); this.listBox.Items.Add(input); this.listBox.EndUpdate(); }),
new object[] { foundstring });
}
Подставьте имя вашего элемента управления списком, и я думаю, что это будет работать. Или вы можете разбить анонимный метод на его собственный объект. Идея состоит в том, что каждый раз, когда вы находите новую строку, вы отправляете работника для выполнения обновления в «главном потоке приложения» (отсюда вызов BeginInvoke ()). Я не ПОЛНОСТЬЮ предъявляю иск, если вызовы begin / endUpdate () строго необходимы, но они могут быть.
Очевидно, как вы ПОЛУЧАЕТЕ строки, зависит от вас, но это должен быть способ получить его в списке на лету, если ваше приложение является многопоточным. Если он не многопоточный, прямой Invoke () (вместо BeginInvoke) должен работать для немедленного обновления списка, но это, вероятно, ухудшит производительность вашего поиска.