Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# Windows Forms

Войти
Регистрация
Восстановить пароль
 
Akop07
0 / 0 / 0
Регистрация: 30.07.2013
Сообщений: 6
#1

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

31.07.2014, 14:59. Просмотров 499. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Статическая переменная на два потока WinForm и BackgroundWorker (C#):

.NET 4.x BackgroundWorker и MainForm ошибка потока - C#
Уважаемые участники форума. Помогите пожалуйста. Пишу программу и никак не могу победить ошибку. Вот кусок...

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

BackGroundWorker запускается два раза - C#
public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } ...

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

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

.NET 4.x Два потока в одном процессе, конфликт чтения/записи файлов - C#
Пробую вникнуть в многопоточность. Хочу написать программу которая создает два потока, которые открывают метод Reader и метод Writer...

4
nedel
574 / 574 / 250
Регистрация: 09.04.2014
Сообщений: 1,356
Завершенные тесты: 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
574 / 574 / 250
Регистрация: 09.04.2014
Сообщений: 1,356
Завершенные тесты: 1
31.07.2014, 18:05 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
Привет! Вот еще темы с ответами:

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

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

Статическая переменная - PHP
&lt;html&gt;&lt;body&gt; &lt;?php function selfcount() { static $count = 0; $count++; echo $count; } for($i=0; $i&lt;5; $i++) selfcount();...

Статическая переменная? - Lua
Мне надо в lua функции определить переменную с поведением static, как в C++. Как это можно сделать? В lua есть для этого какой-то механизм...


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

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

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