Цель:Cross вопрос потоковая обновления источника данных
После того, как я нажать на кнопку запуска на моем пользовательском интерфейсе, я в настоящее время огонь два фоновых рабочих.
BGWorker 1 отвечает за вызов DLL-метод для обхода сайта BGWorker 2 отвечает за обновление DataGridView, используя Datasource = источник сеттер
вопросы:
Мой длл получает в качестве аргумента , ссылка на источник данных, который будет заполнен во время работы .dll. В принципе, DLL собирается добавлять объект в источник данных раз в то время, пока он не завершится.
BGWorker 2 делает это:
while (1 == 1) // Runs until is it manually disposed
{
CoursesGrid.BeginInvoke // inline method
(
(Action) delegate
{
if (_coursesSource.Count > 0) // if source is not empty,Binds.
{
try
{
CoursesGrid.DataSource = _coursesSource;
CoursesGrid.EndEdit();
}
catch (Exception ex)
{
Logs.LogWriter.LogError(ex);
}
}
else
{
// Signals User To keep Waiting
}
}
);
Thread.Sleep(4000);
Поведение потока:
- Dll вызывается
- Метод Разбирает элемент и добавляет к источнику
- В конце концов, BGWorker 2 Пробуждает и связывает источник DataGridView с измененным источником
- Dll нити продолжают разбор, но не только он пытается добавить новый элемент к источнику
TL: DR: тему 1 Записывает на источник Thread 2 Читает этот модифицированный источник, и связывает его с DataGridView к нему освежит тему 1 Не удается снова писать на источник:
"Cross-thread operation not valid: Control 'CoursesGrid' accessed from a thread other than the thread it was created on."}
Обе нити обработки того же источника, но BGWorker 2, только связывает его с интерфейсом, это должно работать. Любая идея о том, что может произойти здесь?
Я предполагаю, что что-то не работает так, как вы хотите, может быть, вы могли бы рассказать нам, что работает или не работает, и каковы ошибки. – CodingGorilla
btw, fyi, В C# 3.0 вы можете написать только 'BeginInvoke (() => {...})' – abatishchev
@CodingGorilla Отредактировано. Извините, если это было непонятно в первый раз. Добавлено TL: DR –