Позвольте мне сделать еще один удар в этом ...
1.) Перетащите ListView на Форме
2.) Перетащите BackgroundWorker на Форме
3.) Создайте метод сделать итерацию по коллекции ListViewItem
private void LoopThroughListItems()
{
foreach (ListViewItem i in listView1.CheckedItems)
DoSomething();
}
4.) Добавить код для вызова LoopThroughListItems() внутри
BackgroundWorker в DoWork Event
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
LoopThroughListItems();
}
5.) В вашей загрузке формы - выполнить код на главном потоке (он работает), то на backgroundWorkder нити (она не)
private void Form1_Load(object sender, EventArgs e)
{
// Try it on the UI Thread - It works
LoopThroughListItems();
// Try it on a Background Thread - It fails
backgroundWorker1.RunWorkerAsync();
}
6.) Изменить код, чтобы использовать IsInvokeRequired/Invoke
private void LoopThroughListItems()
{
// InvokeRequired == True when executed by non-UI thread
if (listView1.InvokeRequired)
{
// This will re-call LoopThroughListItems - on the UI Thread
listView1.Invoke(new Action(LoopThroughListItems));
return;
}
foreach (ListViewItem i in listView1.CheckedItems)
DoSomething();
}
7.) Запустите приложение еще раз - теперь он работает с потоком пользовательского интерфейса и потоком, отличным от UI.
Это решение проблемы. Проверка IsInvokeRequired/Invoking - это общий шаблон, который вы привыкнете к большому количеству (именно поэтому он включен во все элементы управления). Если вы делаете все это за место, вы можете сделать что-то умное и обернуть все это - как описано здесь: Automating the InvokeRequired code pattern
Возможный дубликат: http://stackoverflow.com/questions/6092519/winforms-thread-safe-control-access – zmbq
Если вы можете использовать 'BackgroundWorker' каждого элемента управления в вашей форме уже является читаемым ... – Marco
Покажите нам код, который вы используете, пожалуйста ... – Marco