Организовать "общение" с главного потока по индексу ListBox с нужным WebBrowser - C#

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени. Столкнулся с проблемой написания многопоточной софтины... вся суть в том, что есть у меня на WinForm загрузка файла в котором в каждой новой строке есть креды на аккаунт (акк,пасс), при загрузке данного списка, для каждого юзера должно создаваться динамически свой WebBrowser для подальших манипуляций данным экземпляром WebBrowser для юзера... В общем, создаю N-ное кол-во потоков
for (int i = 0; i < LoadList.userDictionary.Count; i++)
                {
usersList.Items.Add(LoadList.userDictionary.Elemen  tAt(i).Key);
                    Thread th = new Thread(() => Main.mainWork(i, LoadList.userDictionary.ElementAt(i).Key, LoadList.userDictionary.ElementAt(i).Value));
                    th.IsBackground = true;
                    th.SetApartmentState(ApartmentState.MTA);
                    th.Start();
                    Thread.Sleep(100);
                }
которые в свою очередь создают экземпляр браузера, логинятся и данный экзепляр браузера запихиваю в Dictionary, чтоб потом при нажатии на ListBox на форме (какой-то юзер) можно было манипулировать нужным экзепляром браузера
public static void mainWork(int userIndex, string login, string pass)
        {
            WebBrowser webBrowser = new WebBrowser();
            webBrowser.ScriptErrorsSuppressed = true;
            webBrowser.Navigate("http://www.url.ua");
            webBrowser.Document.GetElementById("email-input").SetAttribute("value", login);
            webBrowser.Document.GetElementById("pwd-input").SetAttribute("value", pass);
 
            foreach (HtmlElement el in webBrowser.Document.GetElementsByTagName("button"))
            {
                if (el.GetAttribute("type").Equals("submit"))
                {
                    el.InvokeMember("click");
                    break;
                }
            }
 
            webBrowsersDic.Add(userIndex, webBrowser);
            Thread.Sleep(10);
        }
Когда я делал это в одном потоке - при изменении индекса в ListBox - я мог вызывать нормально свой WebBrowser который находился в Dictionary, но сейчас с потоками оно перестало работать...
private void usersList_SelectedIndexChanged(object sender, EventArgs e)
        {
            Main.selectedAcc(usersList.SelectedIndex);
        }
Подскажите плз как могу организовать "общение" с главного потока по индексу ListBox с нужным браузером (потоком). Дополню еще немного, может запутался пока писал этот весь вопрос... на форме есть ListBox с загруженными юзерами (под каждым из них подразумевается экземпляр браузера), при нажатии на конкретную запись (юзера), должна в табличку заноситься разная инфа, которую буду доставать с браузера, + они должны работать параллельно, т.к. там будут бежать разные экшины Вот примерно как выглядит форма S если я совсем галимо разъяснил, вот можно посмотреть на "проект" сейчас он в одном потоке, но нада, как уже выше писал, в нескольких

Решение задачи: «Организовать "общение" с главного потока по индексу ListBox с нужным WebBrowser»

textual
Листинг программы
SomeObject obj = new SomeObject(i,LoadList.userDictionary.ElementAt(i).Key, LoadList.userDictionary.ElementAt(i).Value);
list.SelectedIndexChanged += obj.SomHandler;
 /* либо (o,e) => {   
 ...
obj.Handler();}     
*/
Thread th = new Thread(() => Main.mainWork(obj);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5