drem1lin
@drem1lin
чуть программист, чуть чуть админ...

Как правильно передать объект в поток и изменить его в потоке?

Здравствуйте, я пишу небольшую программу, суть которой сводится к созданию списка неких команд, пакетной обработке этого списка. Т.е. просто последовательно выполнять команды. Для этого я использую список объектов List<GeneralCommand> Commands;. Этот список определяется в конструкторе окна. Я захотел вынести обработку команд в отдельный поток, а в нем их выполнять и менять значение прогрессбара, и т.д. Для этого мне надо передать этот список в поток, для чего я использую ParameterizedThreadStart, но все равно при попытке приведения типа на элемент этого списка я получаю ошибку
InvalidOperationExeption was unhandled и пояснением "вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток"

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

Я только недавно начал изучать язык C# поэтому меня пугают всякие LINQ и иные выражения, и я прошу объяснять как можно проще и с применением наиболее классического синтаксиса.
  • Вопрос задан
  • 1650 просмотров
Пригласить эксперта
Ответы на вопрос 1
petermzg
@petermzg
Самый лучший программист
Прямо изменять визуальные элементы из потока, в котором они не были созданы не получится (обновление прогресс бара). Вам придется делать синхронизацию через invoke или контекст синхронизации.

А данные хорошо передаются:
private void button1_Click(object sender, EventArgs e)
{
     List<string> lstTest = new List<string>();
      var thread = new Thread(Start);
      thread.Start(lstTest);
}

private void Start(object obj)
{
     List<string> lstTest = (List<string>)obj;
     int count = lstTest.Count();
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы