Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Akop07
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 6
1

Статическая переменная на два потока WinForm и BackgroundWorker

31.07.2014, 14:59. Просмотров 1024. Ответов 4
Метки нет (Все метки)

Уважаемые гуру программирования нужна Ваша помощь. Недавно начал изучать C# и столкнулся с проблемой.
Есть форма с элементом WebBrowser и есть метод Begin(), который выполняется в фоновом режиме.
Метод присваивает переменной, объявленной на уровне класса, адрес сайта на который нужно перейти и вызывает событие EventRequest. В обработчике события WebBrowser.Navigate получает переменную с адресом сайта и переходит на него. Первый переход отрабатывается правильно, но последующие нет. В чем может быть причина.
Я предполагаю что это связано с потоками, но не могу понять что именно. Подскажите в каком направлении капать.

Обработчик события EventRequest класс Form1:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void Go()
        {
            if (this.InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate()
                {
                    if (Main.Method == "GET")
                    {
                        webBrowser1.Navigate(Main.GetUrl());
                    }
                    else
                        webBrowser1.Navigate(Main.GetUrl(), "_self", Main.Code.GetBytes(Main.RequestData),
                            "Content-Type:application/x-www-form-urlencoded");
            
                    while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                    {
                        Application.DoEvents();
                    }
                    
                    Main.HtmlDocG = webBrowser1.Document.GetElementsByTagName("html")[0].OuterHtml;
                    Main.RefererG = webBrowser1.Document.Url.ToString();
                    if (Main.HtmlDocG == null)
                    {
                        Logs.LogMessage("Возможно нет интернет соединения", 500);
                        Application.Exit();
                    }
                });
            }
        }
Метод Begin() класс Main:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
private static string Url;
public static Encoding Code = Encoding.GetEncoding("windows-1251");
        private static Object LockObj = new Object();
 
        public static string GetUrl()
        {
            lock (LockObj)
            {
                return Url;
            }
        }
        public static void SetUrl(string url)
        {
            lock (LockObj)
            {
                Url = url;
            }
        }
        
 
        public static void Begin() 
        {
            int AuthCount = Settings.AuthData();
            if (AuthCount == 0)
            {
                Logs.LogMessage("В файле Auth.txt нет данных для авторизации", 500);
                return;
            }
            //Основной цикл
            for (int i = 0; i < AuthCount; i++)
            {
                Array.Clear(CollectionAds, 0, CollectionAds.Length);
                CollectionAdsCount = 0;
                Thread.Sleep(2500);
                Method = "GET";
                SetUrl(Settings.LoginPage);
                EventRequest();
 
                Logs.LogMessage("Авторизация " + Settings._Login[i], 200);
                Thread.Sleep(2500);
                Authorization(HtmlDocG, i);
                // проверка авторизации
 
                Regex checkRow = new Regex(Settings.CheckRow);
                Match Auth = checkRow.Match(HtmlDocG);
                if (Auth.Success)
                {
                    Logs.LogMessage("Логин " + Settings._Login[i] + " не принят", 500);
                    continue;
                }
                //та ли страница
                if (Settings.ProFiles != RefererG)
                {
                    Thread.Sleep(2500);
                    Method = "GET";
                    SetUrl(Settings.ProFiles);
                    EventRequest();
                }...
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2014, 14:59
Ответы с готовыми решениями:

BackgroundWorker и MainForm ошибка потока
Уважаемые участники форума. Помогите пожалуйста. Пишу программу и никак не...

BackgroundWorker: попытка доступа к элементу управления не из того потока
Здравствуйте. Прошу помочь разобраться с BackgroundWorker. Только начинаю...

BackGroundWorker запускается два раза
public Form1() { InitializeComponent(); ...

В сервисе не видна переменная из потока
Есть сервис в котором при старте создается поток который проверяет налечее в...

Что будет, если два разных потока попытаются отправить одновременно одному клиенту два разных пакета
Здравствуйте! Имеется вот такой незамысловатый метод отправки пакетов на сокет...

4
nedel
599 / 595 / 349
Регистрация: 09.04.2014
Сообщений: 1,422
Завершенные тесты: 1
31.07.2014, 15:21 2
У Вас код в методе Go срабатывает только тогда, когда он вызывается не с основного потока. Попробуйте так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 private void Go()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(Go));
                return;
            }
 
            if (Main.Method == "GET")
            {
                webBrowser1.Navigate(Main.GetUrl());
            }
            else
                webBrowser1.Navigate(Main.GetUrl(), "_self", Main.Code.GetBytes(Main.RequestData),
                    "Content-Type:application/x-www-form-urlencoded");
 
            while (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
            {
                Application.DoEvents();
                System.Threading.Thread.Sleep(50);
            }
 
            Main.HtmlDocG = webBrowser1.Document.GetElementsByTagName("html")[0].OuterHtml;
            Main.RefererG = webBrowser1.Document.Url.ToString();
            if (Main.HtmlDocG == null)
            {
                Logs.LogMessage("Возможно нет интернет соединения", 500);
                Application.Exit();
            }
        }
0
Akop07
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 6
31.07.2014, 16:48  [ТС] 3
Спасибо что ответили но дело не в этом т.к. обращение к методу Go() всегда происходит из BackgroundWorker.
Если не использовать фоновый поток все работает идеально, но форма виснет. Я предполагаю что проблема в чтении/записи переменной Url.

Добавлено через 53 минуты
Что бы было понятней приведу пример.

C#
1
2
Url = "http://example.ru/?id=111";
WebBrowser.Navigate(Url);
Этот код направит нас на http://example.ru/?id=111, Но последующий вызов

C#
1
2
Url = "http://example.ru/?id=222";
WebBrowser.Navigate(Url);
Все равно направит на http://example.ru/?id=111
0
nedel
599 / 595 / 349
Регистрация: 09.04.2014
Сообщений: 1,422
Завершенные тесты: 1
31.07.2014, 18:05 4
Лучший ответ Сообщение было отмечено Akop07 как решение

Решение

Цитата Сообщение от Akop07 Посмотреть сообщение
Я предполагаю что проблема в чтении/записи переменной Url.
Ну так избавтесь от нее и передавайте URL как параметр в EventRequest
1
Akop07
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 6
31.07.2014, 20:03  [ТС] 5
Спасибо заработала.
0
31.07.2014, 20:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2014, 20:03

Два потока в одном процессе, конфликт чтения/записи файлов
Пробую вникнуть в многопоточность. Хочу написать программу которая создает два...

Модульная переменная или блочная статическая переменная: что лучше
Переменная (тип String) нужна на всем протяжении работы программы. Нужен совет...

Вывод из потока в WinForm
Добрый день, имеется код, который выводит из потока данные на консоль: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru